进阶指南
一、设置用户标识
SDK 实例默认会使用随机 UUID 作为每个用户的默认访客 ID,该 ID 将会作为用户在未登录状态下身份识别 ID。需要注意的是,访客 ID 在用户重新安装 App 以及更换设备时将会变更。
1.1 设置访客 ID
一般情况下,您不需要自定义访客 ID. 请确保已经理解用户识别规则,再进行访客 ID 的设置。
如果您需要替换访客 ID,则应当在初始化 SDK 结束之后立即进行调用,请勿多次调用,以免产生无用的账号
如果您的 App 对每个用户有自己的访客 ID 管理体系,则您可以调用setDistinctId 来设置访客 ID:
// 将访客ID设置为Thinker
TDAnalytics.setDistinctId("Thinker");
如果需要获得当前访客 ID,可以调用 getDistinctId 获取:
//返回访客ID
let distinctId = TDAnalytics.getDistinctId();
1.2 设置账号ID
在用户进行登录时,可调用 login 来设置用户的账号 ID, AE 平台将会以账号 ID 作为身份识别 ID,并且设置的账号 ID 将会在调用 logout 之前一直保留。多次调用 login 将覆盖先前的账号 ID 。
//用户的登录唯一标识,此数据对应上报数据里的#account_id,此时#account_id的值为TA
TDAnalytics.login("TA");
该方法不会上传登录事件
1.3 清除账号 ID
在用户产生登出行为之后,可调用 logout 来清除账号 ID,在下次调用 login 之前,将会以访客 ID 作为身份识别 ID。
// 去除上报数据里的 "#account_id",之后的数据将不带有 "#account_id"
TDAnalytics.logout();
我们推荐您在显性的登出事件时调用 logout,比如用户产生了注销账号这一行为时才调用,而不需要在关闭 App 时调用。
该方法不会上传登出事件
二、发送事件
在 SDK 初始化完成之后,您就可以进行数据埋点,收集用户的的行为信息。一般情况下普通事件即可满足业务需求,您也可以根据自己的实际业务场景使用首次、可更新等事件。
2.1 普通事件
您可以调用 track 来上传事件,建议您根据先前梳理的文档来设置事件的属性,此处以用户购买某商品作为范例:
TDAnalytics.track({
eventName: "product_buy", // 事件名称
properties: {
product_name: "商品名"
} //事件属性
});
2.2 首次事件
首次事件是指针对某个设备或者其他维度的 ID,只会记录一次的事件。例如在一些场景下,您可能希望记录在某个设备上的激活事件,则可以用首次事件来上报数据。
TDAnalytics.trackFirst({
eventName: "device_activation",
properties: { key: "value" }
});
如果您希望以设备以外的其他维度来判断是否首次,则可以为首次事件自定义first_check_id:
// 将用户ID设置为首次事件的first_check_id,实现用户首次激活事件的采集
TDAnalytics.trackFirst({
eventName: "account_activation",
firstCheckId: "TA",
properties: { key: "value" }
});
注意:由于在服务端完成对是否首次的校验,首次事件默认会延时 1 小时入库。
2.3 可更新事件
您可以通过可更新事件实现特定场景下需要修改事件数据的需求。可更新事件需要指定标识该事件的 ID,并在创建可更新事件对象时传入。AE 将根据事件名和事件 ID 来确定需要更新的数据。
// 示例: 上报可被更新的事件,假设事件名为 UPDATABLE_EVENT
// 上报后事件属性 status 为 3, price 为 100
TDAnalytics.trackUpdate({
eventName: "UPDATABLE_EVENT",
properties: { status: 3, price: 100 },
eventId: "test_event_id"
});
// 上报后事件属性 status 被更新为 5, price 不变
TDAnalytics.trackUpdate({
eventName: "UPDATABLE_EVENT",
properties: { status: 5 },
eventId: "test_event_id"
});
2.4 可重写事件
可重写事件与可更新事件类似,区别在于可重写事件会用最新的数据完全覆盖历史数据,从效果上看相当于删除前一条数据,并入库最新的数据。AE 将根据事件名和事件 ID 来确定需要更新的数据。
// 示例: 上报可被重写的事件,假设事件名为 OVERWRITE_EVENT
// 上报后事件属性 status 为 3, price 为 100
TDAnalytics.trackOverwrite({
eventName: "OVERWRITE_EVENT",
properties: { status: 3, price: 100 },
eventId: "test_event_id"
});
// 上报后事件属性 status 被更新为 5, price 属性被删除
TDAnalytics.trackOverwrite({
eventName: "OVERWRITE_EVENT",
properties: { status: 5 },
eventId: "test_event_id"
});
2.5 公共事件属性
对于一些重要的属性,譬如用户的设备 ID、来源渠道、用户状态等,这些属性需要设置在每个事件中,此时您可以将这些属性设置为公共属性,即每个事件中都带有的属性。我们推荐您在发送事件前,先设置公共属性。
2.5.1 静态公共事件属性
对于一些重要的属性,譬如用户的渠道、昵称、ID 等,这些属性需要设置在每个事件中,您可以调用setSuperProperties 来设置静态公共事件属性,静态公共事件属性会对全局生效。
// 设置公共事件属性,所有数据事件中都会带有这些属性
TDAnalytics.setSuperProperties({
channel: "渠道名",
user_name: "用户名"
});
除了属性设置,我们也提供其他API来操作静态公共事件属性,满足日常的业务需求。
// 获取静态公共事件属性
let superProperties = TDAnalytics.getSuperProperties();
// 清除一条静态公共事件属性,比如将之前设置 'channel' 属性清除,之后的数据将不会该属性
TDAnalytics.unsetSuperProperty("channel");
// 清除所有静态公共事件属性
TDAnalytics.clearSuperProperties();
2.5.2 动态公共事件属性
通过 setDynamicSuperProperties 设置动态公共属性的回调函数,SDK 将会在事件上报时触发回调函数,并把返回 JSON 对象加入到事件属性中。setDynamicSuperProperties 的参数是一个函数,函数需要返回一个 JSON 对象。
// 设置动态公共属性,在事件上报时触发回调函数,并把返回的JSON对象加入到事件属性中
TDAnalytics.setDynamicSuperProperties(() => {
return {
dy_name: 'xxx',
dy_age: 18
}
})
2.6 记录事件时长
如果您需要记录某个事件的持续时长,可以调用 timeEvent 来开始计时。配置您想要计时的事件名称,当您上传该事件时,将会自动在您的事件属性中加入 #duration 这一属性来表示记录的时长,单位为秒。需要注意的是,同一个事件名只能有一个在计时的任务。
//以下示例,完成用户在某个商品页面停留时长的统计
TDAnalytics.timeEvent("stay_shop");
/**do someting
.......
**/
//用户离开商品页面,计时结束,"stay_shop" 这一事件中将会带有表示事件时长的属性#duration
TDAnalytics.track({
eventName: "stay_shop",
properties: {
product_name: "商品名"
}
});
三、用户属性
TA 平台支持的用户属性设置API有: userSet、userSetOnce、userAdd、userUnset、userDelete、userAppend、userUniqAppend。
3.1 userSet
对于一般的用户属性,您可以调用 userSet 来进行设置。使用该接口上传的属性将会覆盖原有的属性值,如果之前不存在该用户属性,则会新建该用户属性,类型与传入属性的类型一致,此处以设置用户名为例:
// username为TA
TDAnalytics.userSet({
properties: {
username: "TA"
}
});
//username为AE
TDAnalytics.userSet({
properties: {
username: "TE"
}
});
3.2 userSetOnce
如果您要上传的用户属性只要设置一次,则可以调用 userSetOnce 来进行设置,当该属性之前已经有值的时候,将会忽略这条信息,以设置首次付费时间来为例:
//first_payment_time为2018-01-01 01:23:45.678
TDAnalytics.userSetOnce({
properties: {
first_payment_time: "2018-01-01 01:23:45.678"
}
});
//first_payment_time仍然为2018-01-01 01:23:45.678
TDAnalytics.userSetOnce({
properties: {
first_payment_time: "2018-12-31 01:23:45.678"
}
});
3.3 userAdd
当您要上传数值型的属性时,您可以调用 userAdd 来对该属性进行累加操作,如果该属性还未被设置,则会赋值 0 后再进行计算。如果传入负值,等同于减法操作。
//此时total_revenue为30
TDAnalytics.userAdd({
properties: {
total_revenue: 30
}
});
//此时total_revenue为678
TDAnalytics.userAdd({
properties: {
total_revenue: 648
}
});
3.4 userUnset
当您要清空用户的用户属性值时,您可以调用 userUnset 来对指定属性进行清空操作,如果该属性还未在集群中被创建,则 userUnset 不会创建该属性
// 清空该用户属性名为 userPropertykey 的用户属性值,即设置成 NULL
TDAnalytics.userUnset({
property: "userPropertykey"
});
3.5 userDelete
如果您要删除某个用户,可以调用 userDelete 将这名用户删除,您将无法再查询该名用户的用户属性,但该用户产生的事件仍然可以被查询到。
TDAnalytics.userDelete();
3.6 userAppend
您可以调用 userAppend 对数组类型的用户数据追加元素。
TDAnalytics.userAppend({
properties: {
user_list: ["apple", "ball"]
}
});
3.7 userUniqAppend
您可以调用 userUniqAppend 对 Array (List) 类型的用户数据追加唯一元素。调用 userUniqAppend 接口会对追加的用户属性进行去重, userAppend 接口不做去重,用户属性可存在重复。
//此时user_list的属性值为["apple","ball"]
TDAnalytics.userAppend({
properties: {
user_list: ["apple", "ball"]
}
});
//此时user_list的属性值为["apple","apple","ball","cube"]
TDAnalytics.userAppend({
properties: {
user_list: ["apple", "cube"]
}
});
//此时user_list的属性值为["apple","ball","cube"]
TDAnalytics.userUniqAppend({
properties: {
user_list: ["apple", "cube"]
}
});
四、加密功能
SDK 支持使用AES+RSA加密数据。数据加密功能需要客户端和服务端配合完成,具体使用方法请咨询客户成功人员。
let config = new TDConfig()
config.appId = 'app_id'
config.serverUrl = 'server_url'
//开启加密功能 设置公钥信息
config.enableEncrypt(1,'publicKey')
TDAnalytics.initWithConfig(context, config)
五、开启与 H5 页面的打通
如果需要与采集 H5 页面数据的 JavaScript SDK 进行打通,在初始化 WebView 时调用如下接口
controller: webview.WebviewController = new webview.WebviewController();
TDAnalytics.setJsBridge(controller)
六、其他功能
6.1 获取设备ID
您可以调用 getDeviceId() 获取设备 ID。
let deviceId = TDAnalytics.getDeviceId();
设备 ID 会保存在缓存中,用户清理缓存,设备ID会被重置。
6.2 校准时间
SDK 默认会使用本机时间作为事件发生时间,如果用户手动修改设备时间会影响到您的业务分析,此时可以通过校准时间操作保证事件发生时间的准确性。我们提供时间戳、自动两种时间校准方式。
- 您可以使用从服务端获取的当前时间戳对 SDK 的时间进行校准。此后,所有未指定时间的调用,包括事件数据和用户属性设置操作,都会使用校准后的时间作为发生时间。
// 1585633785954 为当前 unix 时间戳,单位为毫秒,对应北京时间 2020-03-31 13:49:45
TDAnalytics.calibrateTime(1585633785954)
- 您也可以设置自动时间校准,之后 SDK 会尝试从 config接口中获取当前时间,并对 SDK 时间进行校准。如果未获取正确的返回结果,后续将使用本地时间上报数据。
let config = new TDConfig()
config.appId = 'appId'
config.serverUrl = 'serverUrl'
//设置为true开启自动时间校准
config.enableAutoCalibrated = true
TDAnalytics.initWithConfig(context, config)
6.3 设置默认时区
默认情况下,SDK 会使用本机时间作为事件发生时间。您也可以通过设置默认时区接口,指定时区,这样所有的事件都将按照您设置的时区来对齐事件时间:
import I18n from '@ohos.i18n';
let config = new TDConfig()
config.appId = 'appId'
config.serverUrl = 'serverUrl'
config.defaultTimeZone = 8
TDAnalytics.initWithConfig(this.context, config)
用指定时区对齐事件时间,会丢掉设备本机时区信息。如果需要保留设备本机时区信息,目前需要您自己为事件添加相关属性。
6.4 立即上报数据
在某些业务场景下,如果您期望数据立即上报到 AE 服务器,可以通过调用flush接口完成
TDAnalytics.flush();
6.5 支持GZIP压缩上报
从1.8.0开始,SDK支持gzip压缩上报数据,开启方式如下:
ohpm install @ohos/flate2
或者在 dependencies 下添加依赖:
"dependencies": {
"@ohos/flate2": "1.0.0"
}
然后在初始化配置中开启 gzip 压缩:
import { gzip } from "@ohos/flate2"
let config = new TDConfig()
config.appId = 'appId'
config.serverUrl = 'serverUrl'
config.enableAutoCalibrated = true
//开启gzip压缩 默认是false enableGzip为true 一定要设置gzipFun 不然无法开启gzip压缩
config.enableGzip = true
config.gzipFun = gzip
TDAnalytics.initWithConfig(this.context, config)
建议使用flate2,这是专为 HarmonyOS 优化的高性能库,支持直接操作压缩数据,性能优于 pako,pako耗时长,性能低,不推荐使用。

