打点底座
framework 把集团统一上报 WebSDK 封装为打点底座:普通页面流量统计(自动 pageView)、自定义事件(useTracker)、通用内容埋点(:track / useExposure)开箱即用。广告埋点 是底座之上的一个消费方,不是底座本身。
接入与配置
上报受双重 gate:
swift.config.json的tracker.enabled(总开关,对应swiftConfig.tracker)system/info.tracker(后端下发的appId/encryptedConfig)
任一缺失 → 静默 no-op(dev warn 一次)。埋点代码照写,配置就绪后自动开始上报,业务零特殊处理。
tracker 配置项另有 autoPageView 子开关(默认开),完整字段见 配置项参考。
两种上报通道(集团 WebSDK / 自建后端)
system/info.tracker 的配置形态决定走哪条通道,二选一:
| 通道 | 后端下发字段 | 上报形态 |
|---|---|---|
| 集团 WebSDK(默认) | { appId, channel, encryptedConfig } | 懒加载 vendored WebSDK,AES 密文配置内解上报域名 + HMAC 签名,发到集团 DMP |
| 自建后端 | { endpoint, siteKey } | 明文 JSON 批量直连自有后端(不加载 WebSDK、不加密签名,埋点非敏感、要轻) |
优先级:endpoint 存在 → 自建通道;否则 appId+encryptedConfig → 集团通道。业务侧完全无感——useTracker().track() / 自动 pageView / :track 全部按配置自动分流。
自建通道行为(utils/tracker/self-hosted.ts):事件入内存队列,满量(默认 10 条)/ 定时(默认 5s)/ 页面隐藏(visibilitychange hidden)/ 卸载(pagehide)时批量 flush;navigator.sendBeacon 优先(卸载期可靠)、fetch keepalive 兜底;全程 client-only + 失败静默。上报 body:
{
"site": "<siteKey>",
"context": { "session_id": "5f0c…", "referrer": "https://www.google.com/", "landing_page": "/movie/1", "utm_source": "google", "utm_medium": "cpc", "screen": "1920x1080", "lang": "zh-CN", "tz": "Asia/Shanghai" },
"events": [
{ "event": "appPageView", "uid": "", "device_id": "d1", "sid": "s1", "page": "/movie", "payload": { "page_key": "home" }, "ts": 1752640000000 }
]
}
context 是整批共用的访问上下文(framework#415),没值的键不写:
session_id:会话 ID,30 分钟无活动换新(userStore.getSessionId(),localStorage 跨 tab 共享);每次 flush 现取referrer/landing_page/utm_source|medium|campaign|term|content:来源、落地页路径与落地 UTM。落地页与 UTM 取本次文档的落地 URL(navigation timing),上报器晚于 SPA 跳转创建也不会丢(landing_page自 framework#417)- 首触字段只随本次页面加载观测到的第一个会话发送(framework#417):长开的页面闲置超过 30 分钟换了新会话后,之后的批次不再带
referrer/landing_page/utm_*,新会话按直接访问处理,不会被归到旧来源;screen/lang/tz每批都带 screen/lang/tz:屏幕尺寸、浏览器语言、时区
事件行的 sid 是页面加载级 ID(每次刷新换新),与 session_id 不是一回事。来源归因是会话级的:后端应按 session_id 取首次出现的 referrer / UTM,本站域名的 referrer 视为站内跳转。
后端按 body.site 校验站点、批量落库即可(参考实现:bayverse bay-api POST /track/batch)。
自动埋点(tracker.client 插件)
client hydration 后,tracker.client 插件在 tracker 配置就绪时懒加载 WebSDK 并 init:
- appPageView:
router.afterEach自动上报(默认开,autoPageView: false关闭)——普通页面流量统计零代码,带业务语义page_key(route meta) - notifyPageLoad:SPA 路由跳转完成(
page:finish)自动通知 SDK 开始新页面统计(首屏归 SDK 生命周期采集,自动跳过)——业务无需关心 - 登录态联动:watch token →
setUid;渠道变化 →setContext({ channel }) - SSR 渲染了 error.vue 的会话不上报;SDK 加载 / 上报失败一律吞掉(console.error),绝不打断业务
SDK 自动采集事件
WebSDK init 成功后会自动采集以下事件,业务与 framework 均无需手动上报:
| 事件 | 说明 |
|---|---|
app_page_view | 页面浏览(首屏 + SPA 路由变化,URL 级) |
page_click | 页面点击(自动补视口 / 滚动 / 坐标衍生字段) |
app_lifecycle | 应用生命周期(cold_start / web_load / foreground 等) |
sdk_init | SDK 初始化完成 |
network_state_change | 网络状态变化 |
app_session_summary | 会话结束摘要(停留时长 / 页面数 / 点击数 / 滚动行为) |
自动采集事件带 is_sdk_auto_collected: 1 标记,与手动 track 的业务语义事件(字典 page_key / page_name)并行共存、数据侧按标记区分——所以 framework 的自动 appPageView 仍保留(数据报表的字典字段依赖它)。旧版的 autoPageClick 选项已随本次升级移除:SDK 自动 page_click 字段更全且默认开启。
自定义事件(useTracker)
const { track } = useTracker()
track('appPageView', { page_key: 'home', page_name: '首页' })
event 接受 28 个 WebSdkEvent 预置枚举 + 任意自定义字符串(覆盖导航 / 推荐 / 内容 / 搜索 / 广告 / IM 等域,保留枚举补全提示)。自定义事件名(如 sign_up / favorite,snake_case)仅自建通道透传入库;集团 WebSDK 通道只认预置枚举、枚举外名 dev 警告后忽略。
禁止直接调
window.WebSDK——useTracker做了 gate(配置未就绪自动 no-op)+ 懒加载 + 容错,裸调在配置缺失时会报错。
内容埋点(:track,opt-in)
SwLink / SwButton 支持 :track prop,一个 prop 搞定内容卡片的曝光 + 点击(不传零行为):
<script setup>
const base = { item_id: '123', item_type: 'video', item_name: '片名', parent_item_id: '', page_key: 'home', page_name: '首页' }
</script>
<template>
<SwLink to="/movie/123" :track="{
exposure: { event: 'appPageitemExposure', payload: base },
click: { event: 'appPageitemClick', payload: { ...base, position: 1 } },
}">…</SwLink>
</template>
- 同一元素曝光与点击的业务字段(
item_id/page_key等)须一致,否则数据侧串不起来 event按场景配对:推荐流(有recommend_trace_id)用recommendListView/recommendListClick;普通内容用appPageitemExposure/appPageitemClick- 播放器 / 视频流的
:track.video只填内容字段,时长 / 进度 / 行为时机由组件自动补,不要在业务侧手算
通用曝光检测(useExposure)
业务自有打点 SDK 或非标场景,用 useExposure() 拿"进视口一次"的时机自行上报(逃生舱)。
事件字段细节
28 个事件各自的 payload 字段(如 appPageView 的 page_key / page_load_time、videoEvent 的 play_progress 等)查集团 WebSDK 官网: