---
code: ios_sdk_multi_appid
name: "多实例"
wikiToken: TTDdwZiy2i1UuFkW72AcqrEXnef
parentWikiToken: T7Ocw5qr7is1Z5k0P6VcZVSKnDd
updateTime: 1762936517000
sourceUrl: https://docs-v2.thinkingdata.cn/?version=v5.0&lan=zh-CN&code=ios_sdk_multi_appid
---
# 多实例

### 一、多实例功能介绍

在 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];

// 设置静态公共属性
[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];

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

// 上报普通事件
[TDAnalytics track:@"product_buy" withAppId:appId_1];

// 上报首次事件
TDFirstEventModel *firstModel = [[TDFirstEventModel alloc] initWithEventName:@"device_activation" firstCheckID:@"TD"];
firstModel.properties = @{@"key":@"value"};
[TDAnalytics trackWithEventModel:firstModel withAppId:appId_1];

// 上报可更新事件
TDUpdateEventModel *updateModel = [[TDUpdateEventModel alloc] initWithEventName:@"UPDATABLE_EVENT" eventID:@"test_event_id"];
updateModel.properties = @{@"status": @3, @"price": @100};
[TDAnalytics trackWithEventModel:updateModel withAppId:appId_1];

// 上报可重写事件
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];

// 登出
[TDAnalytics logoutWithAppId:appId_1];

// 用户属性
[TDAnalytics userSet:@{@"username": @"ThinkingData"} withAppId:appId_2];
[TDAnalytics userSetOnce:@{@"first_payment_time": @"2018-01-01 01:23:45.678"} withAppId:appId_1];
[TDAnalytics userAdd:@{@"total_revenue": @30} withAppId:appId_1];
[TDAnalytics userUnset:@"key" withAppId:appId_1];
[TDAnalytics userDeleteWithAppId:appId_1];
[TDAnalytics userAppend:@{@"user_list": @[@"apple", @"ball"]} withAppId:appId_1];
[TDAnalytics userUniqAppend:@{@"user_list":@[@"apple", @"cube"]} withAppId:appId_1];

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

// 获取设备ID
[TDAnalytics getDeviceId];

[TDAnalytics flushWithAppId:appId_1];

// 三方数据打通
[TDAnalytics enableThirdPartySharing:TDThirdPartyTypeAppsFlyer withAppId:appId_1];
```

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

### 三、创建轻实例

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

```
// 原项目
NSString *appId = @"appId";
NSString *receiverUrl = @"https://receiver-ta-preview.thinkingdata.cn";
[TDAnalytics startAnalyticsWithAppId:appId serverUrl:receiverUrl];

// 通过原项目创建轻实例
NSString *lightProjectAppId = [TDAnalytics lightInstanceIdWithAppId:appId];
    
// 上报事件
[TDAnalytics track:@"event" withAppId:lightProjectAppId];
    
// 用户属性
[TDAnalytics userSet:@{@"age": 18} withAppId:lightProjectAppId];
```

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

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

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

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