注意
- SensorsAnalyticsSDK 从 v3.0.3 开始支持 macOS
- SensorsAnalyticsSDK 从 v4.6.0 开始支持 tvOS
- 在 macOS 和 tvOS,只支持基础的代码埋点,不支持全埋点、可视化全埋点、曝光等高级功能
用户关联
用户关联是为了对用户进行唯一标识,提高用户行为分析的准确性。目前神策提供了简易用户关联和全域用户关联分为用于支撑不同的业务场景。
注意
macOS & tvOS 的用户关联部分的使用 API 参照 iOS SDK 即可,其它功能使用,参照本文档即可
用户属性设置
保留初次属性
对于需要保证只有首次设置时有效的属性,如用户首次充值金额、首次设置的昵称等,可以使用 - setOnce: 或 - setOnce:to: 接口进行记录。与 - set: 方法不同的是,如果被设置的用户属性已存在,则这条记录会被忽略而不会覆盖已有数据,如果属性不存在则会自动创建:
Objective-C
// 设定用户 AdSource 渠道为为 "App Store"
[[SensorsAnalyticsSDK sharedInstance] setOnce:@"AdSource" to:@"App Store"];
// 再次设定用户 AdSource 渠道,设定无效,AdSource 属性值仍然是 "App Store"
[[SensorsAnalyticsSDK sharedInstance] setOnce:@"AdSource" to:@"Email"];
Swift
// 设定用户 AdSource 渠道为为 "App Store"
SensorsAnalyticsSDK.sharedInstance()?.setOnce(["AdSource" : "App Store"])
// 再次设定用户 AdSource 渠道,设定无效,AdSource 属性值仍然是 "App Store"
SensorsAnalyticsSDK.sharedInstance()?.setOnce(["AdSource" : "Email"])
// 设定用户 AdSource 渠道为为 "App Store"
[[SensorsAnalyticsSDK sharedInstance] setOnce:@"AdSource" to:@"App Store"];
// 再次设定用户 AdSource 渠道,设定无效,AdSource 属性值仍然是 "App Store"
[[SensorsAnalyticsSDK sharedInstance] setOnce:@"AdSource" to:@"Email"];
// 设定用户 AdSource 渠道为为 "App Store"
SensorsAnalyticsSDK.sharedInstance()?.setOnce(["AdSource" : "App Store"])
// 再次设定用户 AdSource 渠道,设定无效,AdSource 属性值仍然是 "App Store"
SensorsAnalyticsSDK.sharedInstance()?.setOnce(["AdSource" : "Email"])
数值属性累加
针对一些数值型属性,如消费总额、用户积分等属性,我们可以使用 - increment: 或 - increment:by: 对原值进行累加,神策会自动计算并保存累加之后的值:
Objective-C
// 将用户游戏次数属性增加一次
// increment:by: 对一个属性进行累加
[[SensorsAnalyticsSDK sharedInstance] increment:@"GamePlayed" by:[NSNumber numberWithInt:1]];
// 增加用户付费次数和积分
// increment: 对一个或多个属性进行累加
[[SensorsAnalyticsSDK sharedInstance] increment:@{@"UserPaid" : [NSNumber numberWithInt:1],
@"PointEarned" : [NSNumber numberWithFloat:12.5]}];
Swift
// 将用户游戏次数属性增加一次
//increment:by: 对一个属性进行累加
SensorsAnalyticsSDK.sharedInstance()?.increment("GamePlayed", by: NSNumber.init(value: 1))
// 增加用户付费次数和积分
//increment: 对一个或多个属性进行累加
SensorsAnalyticsSDK.sharedInstance()?.increment(["UserPaid": NSNumber.init(value: 1),
])
// 将用户游戏次数属性增加一次
// increment:by: 对一个属性进行累加
[[SensorsAnalyticsSDK sharedInstance] increment:@"GamePlayed" by:[NSNumber numberWithInt:1]];
// 增加用户付费次数和积分
// increment: 对一个或多个属性进行累加
[[SensorsAnalyticsSDK sharedInstance] increment:@{@"UserPaid" : [NSNumber numberWithInt:1],
@"PointEarned" : [NSNumber numberWithFloat:12.5]}];
// 将用户游戏次数属性增加一次
//increment:by: 对一个属性进行累加
SensorsAnalyticsSDK.sharedInstance()?.increment("GamePlayed", by: NSNumber.init(value: 1))
// 增加用户付费次数和积分
//increment: 对一个或多个属性进行累加
SensorsAnalyticsSDK.sharedInstance()?.increment(["UserPaid": NSNumber.init(value: 1),
])
列表属性追加
对于列表类型用户属性,如用户喜爱的电影、用户点评过的餐厅等属性,可以调用 - append:by: 接口进行追加一些新值:
Objective-C
// 设定用户观影列表属性,设定后属性 "Movies" 为: [@"Sicario", @"Love Letter"]
[[SensorsAnalyticsSDK sharedInstance] append:@"Movies" by:[NSSet setWithArray:@[@"Sicario", @"Love Letter"]]];
Swift
// 设定用户观影列表属性,设定后属性 "Movies" 为: ["Sicario", "Love Letter"]
SensorsAnalyticsSDK.sharedInstance()?.append("Movies", by: ["Sicario","Love Letter"] as (NSFastEnumeration & NSObjectProtocol))
// 设定用户观影列表属性,设定后属性 "Movies" 为: [@"Sicario", @"Love Letter"]
[[SensorsAnalyticsSDK sharedInstance] append:@"Movies" by:[NSSet setWithArray:@[@"Sicario", @"Love Letter"]]];
// 设定用户观影列表属性,设定后属性 "Movies" 为: ["Sicario", "Love Letter"]
SensorsAnalyticsSDK.sharedInstance()?.append("Movies", by: ["Sicario","Love Letter"] as (NSFastEnumeration & NSObjectProtocol))
注意
列表型属性中的元素必须为 NSString 类型,关于列表型限制请见数据格式。
属性取消
如果需要取消已设置的某个用户属性,可以调用 - unset: 进行取消:
Objective-C
// 取消设置 gender 属性
[[SensorsAnalyticsSDK sharedInstance] unset:@"Gender"];
Swift
// 取消设置 gender 属性
SensorsAnalyticsSDK.sharedInstance()?.unset("age")
// 取消设置 gender 属性
[[SensorsAnalyticsSDK sharedInstance] unset:@"Gender"];
// 取消设置 gender 属性
SensorsAnalyticsSDK.sharedInstance()?.unset("age")
获取用户 ID
Objective-C 简版用户关联
神策中每个事件都会关联到一个 ID 上,用于标识该事件所对应的用户或设备信息,我们称之为 distinct_id,您也可以通过 - distinctId 接口获取该 ID:
// 获取事件的 ID 标识
[[SensorsAnalyticsSDK sharedInstance] distinctId];
Swift 简版用户关联
神策中每个事件都会关联到一个 ID 上,用于标识该事件所对应的用户或设备信息,我们称之为 distinct_id,您也可以通过 - distinctId 接口获取该 ID:
// 获取事件的 ID 标识
SensorsAnalyticsSDK.sharedInstance()?.distinctId
Objective-C 全域用户关联
SDK 版本需要 >=4.3.0
获取全域用户关联的 ID
// 获取事件的 ID
NSDictionary *SDKProperties = [[SensorsAnalyticsSDK sharedInstance] identities]; // 可以获取数据体中的 identities 对象:SDKProperties.identities
Swift 全域用户关联
SDK 版本需要 >=4.3.0
获取全域用户关联的 ID
// 获取事件的 ID
NSDictionary *SDKProperties = SensorsAnalyticsSDK.sharedInstance?.identities; // 可以获取数据体中的 identities 对象:SDKProperties.identities
神策中每个事件都会关联到一个 ID 上,用于标识该事件所对应的用户或设备信息,我们称之为 distinct_id,您也可以通过 - distinctId 接口获取该 ID:
// 获取事件的 ID 标识
[[SensorsAnalyticsSDK sharedInstance] distinctId];
神策中每个事件都会关联到一个 ID 上,用于标识该事件所对应的用户或设备信息,我们称之为 distinct_id,您也可以通过 - distinctId 接口获取该 ID:
// 获取事件的 ID 标识
SensorsAnalyticsSDK.sharedInstance()?.distinctId
SDK 版本需要 >=4.3.0
获取全域用户关联的 ID
// 获取事件的 ID
NSDictionary *SDKProperties = [[SensorsAnalyticsSDK sharedInstance] identities]; // 可以获取数据体中的 identities 对象:SDKProperties.identities
SDK 版本需要 >=4.3.0
获取全域用户关联的 ID
// 获取事件的 ID
NSDictionary *SDKProperties = SensorsAnalyticsSDK.sharedInstance?.identities; // 可以获取数据体中的 identities 对象:SDKProperties.identities
默认情况下,用户登录前,distinct_id 是 SDK 根据设备生成的一个匿名 ID,一般为 SerialNumber(序列号)或 UUID。
您也可以通过 - anonymousId 接口获取当前的匿名 ID:
Objective-C
// 获取匿名 ID
[[SensorsAnalyticsSDK sharedInstance] anonymousId];
Swift
// 获取匿名 ID
SensorsAnalyticsSDK.sharedInstance()?.anonymousId()
// 获取匿名 ID
[[SensorsAnalyticsSDK sharedInstance] anonymousId];
// 获取匿名 ID
SensorsAnalyticsSDK.sharedInstance()?.anonymousId()
统计事件时长
v3.0.3+ 版本 SDK 支持代码埋点来统计事件的时长,只需要在行为开始时调用 - trackTimerStart:,在行为结束时调用 - trackTimerEnd:withProperties: 接口,SDK 会自动计算时长,并以秒(浮点数)为单位存在事件的 $event_duration 属性中:
Objective-C
// 开始播放视频时
[[SensorsAnalyticsSDK sharedInstance] trackTimerStart:@"WatchVideo"];
// 暂停播放时
[[SensorsAnalyticsSDK sharedInstance] trackTimerPause:@"WatchVideo"];
// 恢复播放时
[[SensorsAnalyticsSDK sharedInstance] trackTimerResume:@"WatchVideo"];
// 停止或者结束播放时
[[SensorsAnalyticsSDK sharedInstance] trackTimerEnd:@"WatchVideo" withProperties:@{@"VideoType": @"film"}];
Swift
SensorsAnalyticsSDK.sharedInstance()?.trackTimerStart("WatchVideo")
SensorsAnalyticsSDK.sharedInstance()?.trackTimerPause("WatchVideo")
SensorsAnalyticsSDK.sharedInstance()?.trackTimerResume("WatchVideo")
SensorsAnalyticsSDK.sharedInstance()?.trackTimerEnd("WatchVideo", withProperties: ["VideoType" : "film"])
// 开始播放视频时
[[SensorsAnalyticsSDK sharedInstance] trackTimerStart:@"WatchVideo"];
// 暂停播放时
[[SensorsAnalyticsSDK sharedInstance] trackTimerPause:@"WatchVideo"];
// 恢复播放时
[[SensorsAnalyticsSDK sharedInstance] trackTimerResume:@"WatchVideo"];
// 停止或者结束播放时
[[SensorsAnalyticsSDK sharedInstance] trackTimerEnd:@"WatchVideo" withProperties:@{@"VideoType": @"film"}];
SensorsAnalyticsSDK.sharedInstance()?.trackTimerStart("WatchVideo")
SensorsAnalyticsSDK.sharedInstance()?.trackTimerPause("WatchVideo")
SensorsAnalyticsSDK.sharedInstance()?.trackTimerResume("WatchVideo")
SensorsAnalyticsSDK.sharedInstance()?.trackTimerEnd("WatchVideo", withProperties: ["VideoType" : "film"])
同名事件交叉的时长统计
默认情况下,时长的统计以事件名作为标识,相同的事件名会自动匹配 start-end,如果两个同名事件在时间上有交叉部分,会造成错误匹配。为了解决此问题,神策 SDK 支持同名事件交叉的时长统计,开发者需要保存 - trackTimerStart: 的返回值,以便后续针对性地进行暂停、恢复或停止:
Objective-C
// 开始第一个事件计时
NSString *timer1 = [[SensorsAnalyticsSDK sharedInstance] trackTimerStart:@"testTimer"];
// 开始第二个事件计时
NSString *timer2 = [[SensorsAnalyticsSDK sharedInstance] trackTimerStart:@"testTimer"];
//如果需要暂停第一个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerPause:timer1];
//如果需要恢复第一个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerResume:timer1];
// 结束第一个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerEnd:timer1];
// 结束第二个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerEnd:timer2];
Swift
// 开始第一个事件计时
eventTime1 = SensorsAnalyticsSDK.sharedInstance()?.trackTimerStart("testTimer")
// 开始第二个事件计时
eventTime2 = SensorsAnalyticsSDK.sharedInstance()?.trackTimerStart("testTimer")
//如果需要暂停第一个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerPause(eventTime1)
//如果需要恢复第一个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerResume(eventTime1)
// 结束第一个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerEnd("eventTime1")
// 结束第二个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerEnd("eventTime2")
// 开始第一个事件计时
NSString *timer1 = [[SensorsAnalyticsSDK sharedInstance] trackTimerStart:@"testTimer"];
// 开始第二个事件计时
NSString *timer2 = [[SensorsAnalyticsSDK sharedInstance] trackTimerStart:@"testTimer"];
//如果需要暂停第一个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerPause:timer1];
//如果需要恢复第一个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerResume:timer1];
// 结束第一个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerEnd:timer1];
// 结束第二个事件计时
[[SensorsAnalyticsSDK sharedInstance] trackTimerEnd:timer2];
// 开始第一个事件计时
eventTime1 = SensorsAnalyticsSDK.sharedInstance()?.trackTimerStart("testTimer")
// 开始第二个事件计时
eventTime2 = SensorsAnalyticsSDK.sharedInstance()?.trackTimerStart("testTimer")
//如果需要暂停第一个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerPause(eventTime1)
//如果需要恢复第一个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerResume(eventTime1)
// 结束第一个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerEnd("eventTime1")
// 结束第二个事件计时
SensorsAnalyticsSDK.sharedInstance()?.trackTimerEnd("eventTime2")
注意
- 只有调用 - trackTimerEnd: 时,SDK 才会真正记录事件
- 多次调用 - trackTimerStart:,以最后一次调用作为计时起点
- 默认情况下,统计的时长不包括用户 App 在后台的时长
获取预置属性
前端 SDK 在记录事件时会添加设备相关的预置属性,为了保证前后端事件属性的一致性,某些情况下可能需要在前端获取 SDK 预置属性,在 SDK 可以使用 - getPresetProperties 方法获取事件预置属性,然后通过业务接口传到服务端,由服务端添加到事件属性中:
Objective-C
// 获取事件预置属性
[[SensorsAnalyticsSDK sharedInstance] getPresetProperties];
Swift
// 获取事件预置属性
SensorsAnalyticsSDK.sharedInstance()?.getPresetProperties()
// 获取事件预置属性
[[SensorsAnalyticsSDK sharedInstance] getPresetProperties];
// 获取事件预置属性
SensorsAnalyticsSDK.sharedInstance()?.getPresetProperties()
事件动态公共属性
动态公共属性和公共属性的区别是:前者适合标记年龄,后者适合标记性别。
对于一些值会变化的公共属性,如当前游戏等级、最新金币余额等,v3.0.3+ 版本 SDK 提供了- registerDynamicSuperProperties: 接口来设置动态公共属性:
Objective-C
[[SensorsAnalyticsSDK sharedInstance] registerDynamicSuperProperties:^NSDictionary * _Nonnull{
return @{@"level": <#当前游戏等级#>,
@"balance": <#最新金币余额#>};
}];
Swift
SensorsAnalyticsSDK.sharedInstance()?.registerDynamicSuperProperties({ () -> [String : Any] in
return ["level": <#当前游戏等级#>,
"balance", <#最新金币余额#>]
})
[[SensorsAnalyticsSDK sharedInstance] registerDynamicSuperProperties:^NSDictionary * _Nonnull{
return @{@"level": <#当前游戏等级#>,
@"balance": <#最新金币余额#>};
}];
SensorsAnalyticsSDK.sharedInstance()?.registerDynamicSuperProperties({ () -> [String : Any] in
return ["level": <#当前游戏等级#>,
"balance", <#最新金币余额#>]
})
注意
- 事件属性的优先级为:track 事件时传入的属性 > 动态公共属性 > 公共属性> 预置属性
- 动态公共属性的约束和事件属性相同,详情参考数据格式
物品元数据上报
在神策推荐项目中,客户需要将物品元数据上报,以展开后续推荐业务的开发与维护。macOS SDK 提供了设置与删除物品元数据的方法。
item_id(物品 ID) 与 item_type(物品所属类型)共同组成了一个物品的唯一标识。所有的 item 系列方法都必须同时指定物品 ID 及物品所属类型这两个参数,来完成对物品的操作。
设置物品属性
直接设置一个物品,如果已存在则覆盖。除物品 ID 与物品所属类型外,其他物品属性需在 properties 中定义。物品属性中,属性名称与属性值的约束条件与事件属性相同,详细说明请参考 数据格式。
Objective-C
// 设置物品类型为 food 且物品 ID 为 2 的物品设置物品属性 @"name": @"玉米", @"flavour": @"甜"
[[SensorsAnalyticsSDK sharedInstance] itemSetWithType:@"food" itemId:@"2" properties:@{@"name": @"玉米", @"flavour": @"甜"}];
Swift
// 设置物品类型为 food 且物品 ID 为 2 的物品设置物品属性 @"name": @"玉米", @"flavour": @"甜"
SensorsAnalyticsSDK.sharedInstance()?.itemSetWithType:("food", itemId:"2", properties:["name": "玉米", "flavour": "甜"])
// 设置物品类型为 food 且物品 ID 为 2 的物品设置物品属性 @"name": @"玉米", @"flavour": @"甜"
[[SensorsAnalyticsSDK sharedInstance] itemSetWithType:@"food" itemId:@"2" properties:@{@"name": @"玉米", @"flavour": @"甜"}];
// 设置物品类型为 food 且物品 ID 为 2 的物品设置物品属性 @"name": @"玉米", @"flavour": @"甜"
SensorsAnalyticsSDK.sharedInstance()?.itemSetWithType:("food", itemId:"2", properties:["name": "玉米", "flavour": "甜"])
删除物品属性
如果物品不可被推荐需要下线,删除该物品即可,如不存在则忽略。除物品 ID 与 物品所属类型外,不解析其他物品属性。
Objective-C
// 删除物品类型为 food 且物品 ID 为 2 的物品
[[SensorsAnalyticsSDK sharedInstance] itemDeleteWithType:@"food" itemId:@"2"];
Swift
// 删除物品类型为 food 且物品 ID 为 2 的物品
SensorsAnalyticsSDK.sharedInstance()?.itemDeleteWithType("food", itemId:"2")
// 删除物品类型为 food 且物品 ID 为 2 的物品
[[SensorsAnalyticsSDK sharedInstance] itemDeleteWithType:@"food" itemId:@"2"];
// 删除物品类型为 food 且物品 ID 为 2 的物品
SensorsAnalyticsSDK.sharedInstance()?.itemDeleteWithType("food", itemId:"2")
自定义上报策略
为了减少性能和电量损耗,macOS 中事件触发后不会立即上报,而是先将事件缓存在本地,然后定时、批量进行上报。
上报条件
macOS & tvOS SDK 每次触发事件时会检查如下条件,以判断是否向服务器上传数据:
1. 当前网络是否符合 flushNetworkPolicy (默认 WiFi)
2. 与上次发送的时间间隔是否大于 flushInterval (默认 15 秒)
3. 本地缓存的事件条目数是否大于 flushBulkSize (默认 100 条)
只有1、2 或1、3 满足时,SDK 才会进行发送数据。以上参数支持自定义,可以通过修改相应参数值来达到控制事件上报的频率:
Objective-C
SAConfigOptions *options = [[SAConfigOptions alloc] initWithServerURL:@"<#数据接收地址#>" launchOptions:launchOptions];
// 设置触发间隔,默认 15 * 1000 毫秒
options.flushInterval = 10 * 1000;
// 设置触发条数,默认 100 条
options.flushBulkSize = 50;
[SensorsAnalyticsSDK startWithConfigOptions:options];
// 设置上报网络策略,默认 WiFi,注意需要初始化 SDK 之后设置
[[SensorsAnalyticsSDK sharedInstance] setFlushNetworkPolicy:SensorsAnalyticsNetworkTypeALL];
Swift
let options = SAConfigOptions.init(serverURL: "<#数据接收地址#>", launchOptions: launchOptions)
// 设置触发间隔,默认 15 * 1000 毫秒
options.flushInterval = 10 * 1000
// 设置触发条数,默认 100 条
options.flushBulkSize = 50
SensorsAnalyticsSDK.start(configOptions: options)
//设置上报网络策略,默认 3G、4G、5G、WiFi,注意需要初始化 SDK 之后设置
SensorsAnalyticsSDK.sharedInstance()?.setFlushNetworkPolicy(SensorsAnalyticsNetworkType.typeALL)
SAConfigOptions *options = [[SAConfigOptions alloc] initWithServerURL:@"<#数据接收地址#>" launchOptions:launchOptions];
// 设置触发间隔,默认 15 * 1000 毫秒
options.flushInterval = 10 * 1000;
// 设置触发条数,默认 100 条
options.flushBulkSize = 50;
[SensorsAnalyticsSDK startWithConfigOptions:options];
// 设置上报网络策略,默认 WiFi,注意需要初始化 SDK 之后设置
[[SensorsAnalyticsSDK sharedInstance] setFlushNetworkPolicy:SensorsAnalyticsNetworkTypeALL];
let options = SAConfigOptions.init(serverURL: "<#数据接收地址#>", launchOptions: launchOptions)
// 设置触发间隔,默认 15 * 1000 毫秒
options.flushInterval = 10 * 1000
// 设置触发条数,默认 100 条
options.flushBulkSize = 50
SensorsAnalyticsSDK.start(configOptions: options)
//设置上报网络策略,默认 3G、4G、5G、WiFi,注意需要初始化 SDK 之后设置
SensorsAnalyticsSDK.sharedInstance()?.setFlushNetworkPolicy(SensorsAnalyticsNetworkType.typeALL)
强制上报
如果特定事件需要立即上报,可以在事件触发后调用 - flush 接口强制进行上报:
Objective-C
// 立即上报
[[SensorsAnalyticsSDK sharedInstance] flush];
Swift
// 立即上报
SensorsAnalyticsSDK.sharedInstance()?.flush()
// 立即上报
[[SensorsAnalyticsSDK sharedInstance] flush];
// 立即上报
SensorsAnalyticsSDK.sharedInstance()?.flush()
缓存上限
如果事件触发后一直不满足上报条件,本地缓存的数据条数会越来越多,当缓存事件量达到 maxCacheSize 时,每次再触新的事件,SDK 会依次丢弃老数据,保留最新的数据。maxCacheSize 默认为 10000 条,支持客户自定义:
Objective-C
// 设置最大缓存量,默认 10000 条
options.maxCacheSize = 20000;
Swift
// 设置最大缓存量,默认 10000 条
options.maxCacheSize = 20000
// 设置最大缓存量,默认 10000 条
options.maxCacheSize = 20000;
// 设置最大缓存量,默认 10000 条
options.maxCacheSize = 20000
清空本地缓存事件
为了适应 GDPR 要求,v3.0.3+ 版本 SDK 增加了 - deleteAll 方法用于清空本地缓存的所有事件:
Objective-C
[[SensorsAnalyticsSDK sharedInstance] deleteAll];
Swift
SensorsAnalyticsSDK.sharedInstance()?.deleteAll()
[[SensorsAnalyticsSDK sharedInstance] deleteAll];
SensorsAnalyticsSDK.sharedInstance()?.deleteAll()
入库前修改事件信息
v3.0.3+ 版本 SDK 支持在事件入库前进行修改属性、删除事件,可以使用 - trackEventCallback: 中 block 参数进行设置:
- block 中 eventName 参数为当前事件名。
- block 中 properties 参数为当前事件属性,该参数为 NSMutableDictionary 类型,可直接修改此参数达到修改事件属性的目的。
- block 返回值标志事件是否需要继续入库和上报: YES 事件会继续入库,NO 将删除此条事件。
警告
- 严禁在 block 中调用 - track: 、- trackInstallation:、 - login: 等触发事件的接口,会因循环调用而导致应用崩溃
- block 返回 NO 时 SDK 将删除此条事件,所以请确保判断逻辑,以免造成误删除事件
Objective-C
[[SensorsAnalyticsSDK sharedInstance] trackEventCallback:^BOOL(NSString *eventName,
NSMutableDictionary *properties) {
// BuyProduct 事件不进行入库
if ([eventName isEqualToString:@"BuyProduct"]) {
return NO;
}
// 删除 ViewProduct 事件 category 属性
if ([eventName isEqualToString:@"ViewProduct"]) {
[properties removeObjectForKey:@"category"];
}
return YES;
}];
Swift
SensorsAnalyticsSDK.sharedInstance()?.trackEventCallback({ (eventName, properties) -> Bool in
// BuyProduct 事件不进行入库
if (eventName == "BuyProduct"){
return false
}
// 删除 ViewProduct 事件 category 属性
if (eventName == "ViewProduct"){
properties.removeObject(forKey: "category")
}
return true
})
[[SensorsAnalyticsSDK sharedInstance] trackEventCallback:^BOOL(NSString *eventName,
NSMutableDictionary *properties) {
// BuyProduct 事件不进行入库
if ([eventName isEqualToString:@"BuyProduct"]) {
return NO;
}
// 删除 ViewProduct 事件 category 属性
if ([eventName isEqualToString:@"ViewProduct"]) {
[properties removeObjectForKey:@"category"];
}
return YES;
}];
SensorsAnalyticsSDK.sharedInstance()?.trackEventCallback({ (eventName, properties) -> Bool in
// BuyProduct 事件不进行入库
if (eventName == "BuyProduct"){
return false
}
// 删除 ViewProduct 事件 category 属性
if (eventName == "ViewProduct"){
properties.removeObject(forKey: "category")
}
return true
})
自定义匿名 ID
默认情况下,SDK 会生成匿名 ID 并可以保证该 ID 的唯一性,如果需要替换神策默认分配的匿名 ID ,可以在初始化 SDK 之后立即调用 - identify: 方法进行替换。
代码示例:
Objective-C
[[SensorsAnalyticsSDK sharedInstance] identify:<#自定义匿名 ID#>];
Swift
SensorsAnalyticsSDK.sharedInstance()?.identify(<#自定义匿名 ID#>)
[[SensorsAnalyticsSDK sharedInstance] identify:<#自定义匿名 ID#>];
SensorsAnalyticsSDK.sharedInstance()?.identify(<#自定义匿名 ID#>)