menu
Is this helpful?

# 多实例

# 一、多实例功能介绍

在 iOS SDK 1.2.0 版本中,新增了多 APPID 特性,可以创建多个 SDK 实例,分别对应各自的 APPID 进行数据上报,也就是可以向多个 APPID 进行数据上报。

在 iOS SDK 2.1.0 版本中,新增了轻量实例的特性,可以支持对同一 APPID 生成多个子轻量实例,子轻量实例与父实例的 APPID 一致,但账号等信息不一致。

如果您将老版本(1.2.0 之前的版本)SDK 升级至 1.2.0 之后的版本,如果老版本 SDK 本地缓存还有未上报的数据,那么将会直接上报到第一个实例化的 APPID 中。对于只使用一个 APPID 实例的用户而言,数据不会有任何影响。

# 二、如何创建多 SDK 实例

本节介绍 SDK 多实例的使用方式:

[TDAnalytics enableLog:YES];

NSString *appId_1 = @"appId_1";
NSString *receiverUrl_1 = @"https://receiver-ta-preview.thinkingdata.cn";
[TDAnalytics startAnalyticsWithAppId:appId_1 serverUrl:receiverUrl_1];

NSString *appId_2 = @"appId_2";
NSString *receiverUrl_2 = @"https://receiver-ta-preview.thinkingdata.cn";
[TDAnalytics startAnalyticsWithAppId:appId_2 serverUrl:receiverUrl_2];

[TDAnalytics calibrateTimeWithNtp:@"time.apple.com"];

[TDAnalytics login:@"TD" withAppId:appId_1];
[TDAnalytics login:@"TD" withAppId:appId_2];

[TDAnalytics setDistinctId:@"Thinker" withAppId:appId_2];

// super property
[TDAnalytics setSuperProperties:@{@"channel": @"ta",} withAppId:appId_1];
[TDAnalytics setSuperProperties:@{@"channel": @"ta",} withAppId:appId_2];
[TDAnalytics unsetSuperProperty:@"isTest" withAppId:appId_1];
[TDAnalytics clearSuperPropertiesWithAppId:appId_1];
[TDAnalytics getSuperPropertiesWithAppId:appId_1];
[TDAnalytics setDynamicSuperProperties:^NSDictionary * _Nonnull{
    return @{@"now": [NSDate date]};
} withAppId:appId_1];

// auto track
[TDAnalytics enableAutoTrack:TDAutoTrackEventTypeAppInstall | TDAutoTrackEventTypeAppStart | TDAutoTrackEventTypeAppEnd withAppId:appId_1];
// 忽略某个页面的自动采集事件
[TDAnalytics ignoreAutoTrackViewControllers:@[] withAppId:appId_1];
[TDAnalytics setAutoTrackProperties:TDAutoTrackEventTypeAll properties:@{@"auto_key2": @"auto_value2"} withAppId:appId_1];

// track
[TDAnalytics track:@"product_buy" withAppId:appId_1];

// track first
TDFirstEventModel *firstModel = [[TDFirstEventModel alloc] initWithEventName:@"device_activation" firstCheckID:@"TD"];
firstModel.properties = @{@"key":@"value"};
[TDAnalytics trackWithEventModel:firstModel withAppId:appId_1];

// track update
TDUpdateEventModel *updateModel = [[TDUpdateEventModel alloc] initWithEventName:@"UPDATABLE_EVENT" eventID:@"test_event_id"];
updateModel.properties = @{@"status": @3, @"price": @100};
[TDAnalytics trackWithEventModel:updateModel withAppId:appId_1];

// track overwrite
TDOverwriteEventModel *overwriteModel = [[TDOverwriteEventModel alloc] initWithEventName:@"OVERWRITE_EVENT" eventID:@"test_event_id"];
overwriteModel.properties = @{@"status": @3, @"price": @100};
[TDAnalytics trackWithEventModel:overwriteModel withAppId:appId_1];

// 以下示例,完成用户在某个商品页面停留时长的统计
[TDAnalytics timeEvent:@"stay_shop" withAppId:appId_1];
/*
 do someting .......
 */
// 用户离开商品页面,计时结束,"stay_shop" 这一事件中将会带有表示事件时长的属性#duration
[TDAnalytics track:@"stay_shop" withAppId:appId_1];

// logout
[TDAnalytics logoutWithAppId:appId_1];

// user set
[TDAnalytics userSet:@{@"username": @"ThinkingData"} withAppId:appId_2];

// user set once
[TDAnalytics userSetOnce:@{@"first_payment_time": @"2018-01-01 01:23:45.678"} withAppId:appId_1];

// user add
[TDAnalytics userAdd:@{@"total_revenue": @30} withAppId:appId_1];

// user unset
[TDAnalytics userUnset:@"key" withAppId:appId_1];

// user delete
[TDAnalytics userDeleteWithAppId:appId_1];

// user append
[TDAnalytics userAppend:@{@"user_list": @[@"apple", @"ball"]} withAppId:appId_1];

// user uniqe append
[TDAnalytics userUniqAppend:@{@"user_list":@[@"apple", @"cube"]} withAppId:appId_1];

// 打通H5页面数据
[TDAnalytics addWebViewUserAgent];

[TDAnalytics getDeviceId];

[TDAnalytics flushWithAppId:appId_1];

// third party data
[TDAnalytics enableThirdPartySharing:TDThirdPartyTypeAppsFlyer withAppId:appId_1];

请注意多个 SDK 实例的 APPID 必须不同,多实例之间的大多数数据是不共通的,详情可参考第四节“多实例间的数据、设置共享”。

# 三、创建轻实例

在 iOS SDK 3.0.0 版本中,您可以通过轻实例的方式,创建同一个 APPID 下的多个实例

// original project
NSString *appId = @"appId";
NSString *receiverUrl = @"https://receiver-ta-preview.thinkingdata.cn";
[TDAnalytics startAnalyticsWithAppId:appId serverUrl:receiverUrl];

// create light project id with original project
NSString *lightProjectAppId = [TDAnalytics lightInstanceIdWithAppId:appId];
    
// track ...
[TDAnalytics track:@"event" withAppId:lightProjectAppId];
    
// user profile ....
[TDAnalytics userSet:@{@"age": 18} withAppId:lightProjectAppId];

子轻量实例与父实例的 APPID、上报地址以及部分设置一致,但其他信息不共享,详情可参考第四节“多实例间的数据、设置共享”。

# 四、多实例间的数据、设置共享

大多数接口都是由实例对象所调用,因此绝大部分数据与设置在多 APPID 实例、父实例与轻量实例间是不共享的,但有部分数据与设置会对所有实例生效,以下是所有数据与设置在多实例间是否共享的详细说明:

  • 账号相关信息
    • 系统默认生成的访客 ID#distinct_id:共享
    • 调用setDistinctId设置的访客 ID#distinct_id:不共享
    • 调用login设置的账号 ID#account_id:不共享
  • 事件上报track与用户属性上报userSetuserSetOnceuserAdduserDelete:不共享
  • 公共属性setSuperProperties和动态公共属性setDynamicSuperProperties:不共享
  • SDK 配置信息是否在多实例之间共享:
    • 上报策略相关(即上报的间隔时间与每批次数据量):共享,由第一个实例化的 APPID 对应的项目数据决定
    • 上传的网络条件setNetworkType:共享
  • 自动采集事件
    • 建议只在一个实例上开启自动采集事件
    • 支持向多个 APP ID 上报自动采集事件
    • 自动采集事件的设置可以只对单个 APPID 实例生效,详情请参考iOS SDK 自动采集指南
  • 记录事件时长timeEvent:不共享