Skip to content
AI 文档索引 ↗

客户端能力总览 ​

按业务需求选择能力,再按对应平台的步骤安装、授权并确认事件接收。

页面和点击采集的接入方式因界面技术而异:

场景推荐方式接入时需要做什么
Web 页面与指定元素Web 自动采集启用所需能力;点击目标配置选择器白名单
Android Compose、iOS SwiftUI原生 UI 接入为页面和需要记录的控件显式绑定
iOS UIKit原生 UI 接入为需要记录的控件显式绑定
Android 传统 View自动点击采集(实验)配对构建插件和运行时;支持部分 Java/Kotlin Lambda,须验证实际目标
支付完成等业务结果手动 track在业务结果确定时记录,不依赖 UI 点击推断

自动或绑定采集需要满足对应授权和策略;默认授权等级不代表已启用所有自动采集。一次行为选择一个点击采集来源,业务结果可以另行记录。

Android 传统 View 未启用插桩或目标已从插桩采集范围中排除时,可以在已有点击回调中显式记录,随后执行原有业务操作:

kotlin
checkoutButton.setOnClickListener {
    sdk.recordAppClick(action = "checkout_submit", targetTag = "button")
    submitOrder()
}

同一按钮不要同时通过插桩和 recordAppClick 记录点击。升级后部分 Java/Kotlin Lambda 可能新增自动采集;对于原来已显式记录的目标,应移除显式点击记录或通过 ignoredResourceNames 排除该目标,并验证只产生一次点击事件。点击只代表控件被激活;订单提交或支付是否成功应在业务结果确定后另行记录。接口参数见 Android API。

您要实现的功能阅读入口
页面、点击、曝光等其他插件,或原生组件接入组件选择与下方能力目录

IMPORTANT

请确认所用 SDK 包支持所需能力;原生增强器需要 event_enrichment。

1. 选择组件 ​

平台基础安装可选组件与触发责任释放方式
Web同一 Web SDK;ESM 通过 plugins 子路径导入,推荐 Script 包含工厂显式工厂/Pack 或 autocapture;受控 DOM 功能还需声明目标SDK destroy();自定义插件 stop() 清理自己的监听
iOSCore SDKSwiftUI/UIKit 显式 UI 绑定;异常/网络等由 Host 提交;Location 是独立模块释放绑定句柄并 close();视图绑定遵循所在模块生命周期
AndroidCore SDKCompose、Lifecycle 适配按需引入;传统 View AutoTrack 是构建插件与运行时组件配对的实验能力释放安装句柄并 close()

各组件须与 SDK 配套安装。安装方式见 Web、Android、iOS 接入指南。

默认进程后台 flush、身份和 Session 处理是 SDK 的基础职责。停用生命周期事件插件,不等于关闭这些机制。不同平台的页面/曝光机制见 Compose、SwiftUI 与 UIKit。

2. 第一方能力目录 ​

按下表查找能力和接入入口。自动采集默认关闭;启用后仍需满足用户授权、项目采集策略、事件计划和浏览器或系统支持条件。

平台插件采集机制事件授权/默认状态触发条件入口
androidandroid-autotrack构建插桩 + 运行时绑定(实验)$app_clickSTANDARD / 默认关闭配对引入 AGP 插件与运行时包,调用 install 并命中允许的传统 View listener接入说明
androidandroid-exception宿主提交信号$sdk_exceptionSTANDARD / 默认关闭Host 调用 recordNonFatalError;不安装全局 Crash Handler接入说明
androidandroid-exposure宿主/UI 绑定$sdk_exposureSTANDARD / 默认关闭安装对应 UI 曝光绑定并提供稳定目标;手工 recordExposure 另走手工语义接入说明
androidandroid-lifecycle自动观察(需显式注册)$sdk_lifecycleSTANDARD / 默认关闭标准工厂的 Activity 生命周期接入;需授权和插件策略允许接入说明
androidandroid-network-performance宿主提交信号$sdk_network_performanceSTANDARD / 默认关闭Host 提供网络耗时/数量/字节汇总,不拦截全局请求接入说明
androidandroid-performance宿主提交信号$sdk_performanceSTANDARD / 默认关闭Host 提供启动耗时等有界测量值接入说明
iosios-exception宿主提交信号$sdk_exceptionSTANDARD / 默认关闭Host 调用 recordNonFatalError;不安装全局 Crash Handler接入说明
iosios-exposure宿主/UI 绑定$sdk_exposureSTANDARD / 默认关闭安装对应 UI 曝光绑定并提供稳定目标;手工 recordExposure 另走手工语义接入说明
iosios-lifecycle宿主/UI 绑定$sdk_lifecycleSTANDARD / 默认关闭安装 UIKit 应用生命周期适配或转交 Host 生命周期信号接入说明
iosios-network-performance宿主提交信号$sdk_network_performanceSTANDARD / 默认关闭Host 提供网络耗时/数量/字节汇总,不拦截全局请求接入说明
iosios-performance宿主提交信号$sdk_performanceSTANDARD / 默认关闭Host 提供启动耗时等有界测量值接入说明
webweb-dom-click自动观察(需显式注册)$element_clickSTANDARD / 默认关闭点击命中宿主声明的 selectorAllowlist;不读取文本接入说明
webweb-download自动观察(需显式注册)$web_downloadSTANDARD / 默认关闭白名单链接的下载动作元数据接入说明
webweb-exception自动观察(需显式注册)$sdk_exceptionSTANDARD / 默认关闭监听浏览器异常与未处理拒绝;仅有限清洗摘要接入说明
webweb-exposure自动观察(需显式注册)$sdk_exposureSTANDARD / 默认关闭显式 targets 达到可见面积与持续时长条件接入说明
webweb-form自动观察(需显式注册)$web_form_submitSTANDARD / 默认关闭白名单表单提交元数据,不读取输入值接入说明
webweb-interaction自动观察(需显式注册)$sdk_interactionSTANDARD / 默认关闭命中显式 targets 的业务语义交互接入说明
webweb-lifecycle自动观察(需显式注册)$sdk_lifecycleSTANDARD / 默认关闭文档可见性/活动状态变化,不定义 Session 边界接入说明
webweb-network-enrichment事件属性增强只增强当前事件STANDARD / 默认关闭读取当前网络状态快照;可选连接质量受浏览器支持限制接入说明
webweb-network-performance自动观察(需显式注册)$sdk_network_performanceSTANDARD / 默认关闭Resource Timing 网络资源汇总,不读取请求正文接入说明
webweb-page-leave自动观察(需显式注册)$page_leaveSTANDARD / 默认关闭路由切换、页面隐藏或离开时记录停留片段接入说明
webweb-page-load自动观察(需显式注册)$page_loadSTANDARD / 默认关闭读取 Navigation Timing 摘要接入说明
webweb-performance自动观察(需显式注册)$sdk_performanceSTANDARD / 默认关闭浏览器 Performance API 的有界性能摘要接入说明
webweb-rage-click自动观察(需显式注册)$web_rage_clickSTANDARD / 默认关闭显式受控目标内的短时连续点击接入说明
webweb-scroll自动观察(需显式注册)$scrollSTANDARD / 默认关闭滚动达到已配置深度阈值接入说明
webweb-spa-page自动观察(需显式注册)$pageviewSTANDARD / 默认关闭初始化及路由导航;按实例 pageRouting 选择 history/hash接入说明
webweb-stay自动观察(需显式注册)$web_staySTANDARD / 默认关闭页面可见且活跃时累计有效停留接入说明
webweb-visibility自动观察(需显式注册)$web_visibilitySTANDARD / 默认关闭白名单目标的可见性变化接入说明
webweb-vitals自动观察(需显式注册)$sdk_web_vitalSTANDARD / 默认关闭受支持的 PerformanceObserver 体验指标接入说明

3. 选择接入路径 ​

Web 自动采集 ​

按 Web 插件指南选工厂或配方;配置不升级 Consent。DOM 点击/曝光须声明业务目标,表单功能不采集输入正文。

同名配置按 默认配方 → autoPage → autocapture → 显式 plugins 的顺序覆盖。框架负责页面采集时,设置 autoPage: 'manual'。动态注册的插件名称不能重复;替换前先注销旧插件。

原生内置处理器和 UI 绑定 ​

原生通过 policy.pluginEnabled 允许插件运行,使用 allowlist 只启用所需插件,再按目录绑定 UI 或调用 Host API。默认 GRANTED + MINIMAL 不满足大部分自动采集要求;应在宿主确认授权后提升到 STANDARD。

原生 started 表示策略准入;Host 未提供信号时没有事件是正常状态。异常摘要不等于完整 Crash 监控;网络汇总不等于 SDK 已拦截 App 的所有请求。

各端采用同一准入概念,配置字段遵循各自 API,不能直接跨语言复制:

配置WebiOS / Android
插件总开关policy.pluginPolicy.enabledpolicy.pluginEnabled
插件白名单policy.pluginPolicy.allowlistpolicy.pluginAllowlist
自定义增强器plugins 中的 enrichment 对象iOS enrichmentPlugins;Android eventEnrichers

Android Java 可通过 Builder 设置 pluginEnabled(...) 和 pluginAllowlist(...)。

自定义业务属性增强 ​

单个宿主的字段调整/过滤可继续使用 beforeSend。多模块复用使用命名增强器,按配置列表顺序执行;同名业务属性由后一个覆盖。增强器返回 null/nil 表示不修改,不能用来删除事件。三个平台都在最终隐私和事件计划检查前执行增强。

Web 在 plugins 中提供 role: 'enrichment'、start() 和 enrich(),详见 Web 自定义插件。

以下配方都先安装增强器并保持 PENDING,随后由宿主自己的授权流程决定是否启用。实例在项目作用域内复用,不要为每条事件创建实例。

查看各平台增强器配置示例

Web 注册 ​

typescript
import { TrackBusinessSDK } from '@track-business/sdk-web';

const sdk = TrackBusinessSDK.create({
  endpoint: 'https://collector.example.com/v1/events/batch',
  projectKey: 'web-public-project-key',
  initialConsent: { status: 'PENDING' },
  policy: { pluginPolicy: { enabled: true, allowlist: ['checkout-context'] } },
  plugins: [
    {
      name: 'checkout-context',
      role: 'enrichment',
      requiredConsent: 'STANDARD',
      start() {},
      enrich(event) {
        return event.eventName === 'checkout_completed'
          ? { properties: { business_area: 'checkout' } }
          : null;
      },
    },
  ],
});
await sdk.ready();

Android Java 注册 ​

Android Java/Kotlin 标准工厂使用 Map 和同步回调,无需接触内部 JsonObject:

java
EventEnricher business = EventEnricher.create("checkout-context", input ->
    "checkout_completed".equals(input.getEventName())
        ? EventEnrichmentPatch.properties(Collections.singletonMap("business_area", "checkout"))
        : null);
TrackBusinessConfig config = TrackBusinessConfig.builder()
    .initialConsent(com.trackbusiness.sdk.models.ConsentDecision.pending())
    .eventEnrichers(Collections.singletonList(business))
    .pluginEnabled(true)
    .pluginAllowlist(Collections.singleton("checkout-context"))
    .build();
TrackBusinessSDK sdk = TrackBusinessSDK.create(context, endpoint, projectKey, config);

Android Kotlin 注册 ​

kotlin
import com.trackbusiness.sdk.EventEnricher
import com.trackbusiness.sdk.EventEnrichmentPatch
import com.trackbusiness.sdk.TrackBusinessConfig
import com.trackbusiness.sdk.TrackBusinessSDK
import com.trackbusiness.sdk.models.ConsentDecision
import com.trackbusiness.sdk.models.SDKPolicy

val business = EventEnricher.create("checkout-context") { input ->
    if (input.eventName == "checkout_completed")
        EventEnrichmentPatch.properties(mapOf("business_area" to "checkout"))
    else null
}
val config = TrackBusinessConfig(
    initialConsent = ConsentDecision.pending(),
    policy = SDKPolicy(pluginEnabled = true, pluginAllowlist = setOf("checkout-context")),
    eventEnrichers = listOf(business),
)
val sdk = TrackBusinessSDK.create(context, endpoint, projectKey, config)

iOS Swift 注册 ​

iOS 标准 create 和 createWithRemotePolicy 都接受 enrichmentPlugins:

swift
struct CheckoutContext: EventEnrichmentPlugin {
    let name = "checkout-context"
    let requiredConsent = "STANDARD"
    func enrich(_ event: EventEnvelope) throws -> EventEnrichmentResult? {
        guard event.eventName == "checkout_completed" else { return nil }
        return EventEnrichmentResult(properties: ["business_area": .string("checkout")])
    }
}
let sdk = try TrackBusinessSDK.create(
    endpoint: endpoint, projectKey: projectKey,
    policy: SDKPolicy(pluginEnabled: true, pluginAllowlist: ["checkout-context"]),
    initialConsent: .pending,
    enrichmentPlugins: [CheckoutContext()]
)

离线二进制包使用 import TrackBusinessSDKKit;源码 Swift Package 使用 import TrackBusinessSDK。

宿主确认授权后,再触发事件 ​

下面的代码只能放在宿主/CMP 已确认相应授权的分支中;它不是自动授权逻辑。只执行上面的注册示例时,PENDING 下没有事件是预期行为。

typescript
await sdk.grantConsent('STANDARD');
sdk.track('checkout_completed', {});
java
sdk.grantConsent("STANDARD", error -> {
    if (error == null) sdk.track("checkout_completed", Collections.emptyMap());
});
kotlin
sdk.grantConsent("STANDARD") { error ->
    if (error == null) sdk.track("checkout_completed")
}
swift
sdk.grantConsent(level: "STANDARD") { applied in
    if applied { sdk.track("checkout_completed", properties: [:]) }
}

事件应包含 properties.business_area = "checkout"。使用真实接收端核对该字段及整批 ACK;入队、Health 或一次 flush() 调用返回都不能单独证明后端收到。收尾分别使用 Web await sdk.destroy()、原生 sdk.close();不要为刷新事件关闭项目级单例。

增强器只修改允许的业务属性,不能改写身份、Session、事件 ID 或投递字段。名称冲突时请调整插件名,手工事件仍可使用。

4. 故障与成本边界 ​

  • Web enrichTimeoutMs / stopTimeoutMs 默认 1000ms,本地范围 1–5000ms;每插件最多保留一个未完成增强任务。超时后保留事件,后续事件绕过该任务,迟到结果丢弃。停止未完成时不会重叠启动;任务结束后可再次显式更新策略恢复。
  • 任意 Promise 不能被 SDK 强制取消;插件仍应遵循 AbortSignal 并清理资源。同步死循环不能被同线程计时器中断。
  • 原生增强器是同步短任务;不要执行网络请求、磁盘 I/O、等待主线程或重入 SDK。宿主异步预取业务数据,增强时读取有界缓存。
  • 属性补丁默认预算 16384 bytes,可受现有插件预算配置约束;超限或异常时跳过本次增强,原事件继续走隐私和准入检查。它不是敏感数据脱敏的替代机制。
  • SDK 不提供任意第三方代码的进程级安全沙箱。插件只能来自受信、经审查的代码;名称与诊断不得放入身份值、Token 或原始业务数据。

5. 集成验证顺序 ​

  1. 核对真实安装包、版本与可选依赖,使用标准 create。
  2. 检查配置、授权、Health 的阻断原因;绑定目标或提供 Host 信号。
  3. 触发一个确定动作,检查入队/过滤诊断和事件语义。一个指标作用域选择一个生产者,避免同一点击同时绑定两条路径。
  4. flush 后核对本地队列与合法整批 ACK,再核对后端实际接收。Health、候选计数和 autoEvents 都不是 ACK。
  5. 在目标应用与接收环境中验证撤销授权、解绑、重启、异常与恢复。

旧配置迁移及组合优先级变化见 迁移指南。