iOS 接入教程(Objective-C/Swift)
1. 环境要求
| 说明 | |
|---|---|
| 兼容版本 | iOS 11.0 及以上系统 |
| 支持架构 | 真机 arm64;模拟器 arm64, x86_64 |
| SDK 形态 | RiskPerception.xcframework |
| 主要模块 | HTProtect、HTProtectConfig、AntiCheatResult |
2. 合规说明
2.1 隐私合规指引
集成本 SDK 时,请遵循易盾隐私合规要求:风控引擎隐私合规指引 - 网易易盾。
必须满足:请在用户同意隐私政策后,再初始化 SDK 和调用业务接口。
2.2 iOS 隐私清单要求
RiskPerception.framework 已包含 PrivacyInfo.xcprivacy。接入方仍需按 App 自身采集与使用情况,完成 App 隐私政策、App Store 隐私信息和必要权限说明。
隐私清单声明的 Required Reason API 类型包括:
| 类型 | Reason |
|---|---|
NSPrivacyAccessedAPICategoryDiskSpace |
E174.1 |
NSPrivacyAccessedAPICategoryFileTimestamp |
C617.1 |
NSPrivacyAccessedAPICategorySystemBootTime |
35F9.1 |
NSPrivacyAccessedAPICategoryUserDefaults |
CA92.1 |
隐私清单声明的采集数据类型包括:
| 数据类型 | 关联用户 | 追踪 | 用途 |
|---|---|---|---|
NSPrivacyCollectedDataTypeUserID |
否 | 否 | App Functionality |
NSPrivacyCollectedDataTypeOtherUsageData |
否 | 否 | App Functionality |
3. 导入 SDK
3.1 添加 XCFramework
将 RiskPerception.xcframework 添加到 iOS 工程,并确认:
- App Target 的
Frameworks, Libraries, and Embedded Content中已包含RiskPerception.xcframework; - 真机 Release 包包含
ios-arm64产物; - 模拟器调试使用
ios-arm64_x86_64-simulator产物; PrivacyInfo.xcprivacy随 framework 一起进入最终产物。
3.2 Objective-C 工程导入
在需要调用 SDK 的文件中导入:
#import <RiskPerception/HTProtect.h>
#import <RiskPerception/HTProtectConfig.h>
#import <RiskPerception/AntiCheatResult.h>
3.3 Swift 工程导入
Swift 工程直接导入模块:
import RiskPerception
如果工程使用 Objective-C Bridging Header,也可以在桥接头中导入:
#import <RiskPerception/HTProtectSwift.h>
3.4 旧接口说明
以下旧接口已废弃:
| 旧接口 | 状态 | 新接口 |
|---|---|---|
NTESRiskUniPerception |
已废弃 | HTProtect |
NTESRiskUniConfiguration |
已废弃 | HTProtectConfig |
新接入文档、示例代码和 AI 辅助接入均不得再使用旧接口。
4. 初始化
前置条件(必须满足):
- 必须在用户同意隐私政策后再调用;
initialize/init:config:callback:必须先于其他 SDK 接口调用;- 建议 App 启动后完成隐私授权判断,再初始化一次;
productId请从易盾官网后台获取。
4.1 方法定义
Objective-C:
+ (instancetype)sharedInstance;
- (void)init:(NSString *)productId
config:(nullable HTProtectConfig *)config
callback:(nullable HTPCallback)callback;
Swift:
HTProtect.sharedInstance().initialize(_:config:callback:)
4.2 HTPCallback 回调说明
typedef void (^HTPCallback)(int code, NSString *msg, NSString *content);
| 参数 | 说明 |
|---|---|
code |
初始化结果码 |
msg |
初始化结果说明 |
content |
初始化返回内容,失败时通常为空字符串 |
常见 code 说明:
| code | 含义 | 建议处置 |
|---|---|---|
200 |
初始化正常,SDK 一切正常 | 可继续调用其他接口 |
199 |
初始化参数错误 | 检查 productId、config 等入参是否正确 |
初始化响应内部包含 Token 缓存时长 cacheTime,默认 60 秒,具体值以服务端配置为准。SDK 根据该时长维护内存缓存;该配置不改变现有 HTPCallback 回调签名。
iOS SDK 的
RequestCmdID包含Cmd_GetHTPVersion和Cmd_GetDeviceId。iOS SDK 不提供Cmd_SetConfigData配置回填接口。
4.3 初始化示例
Objective-C
#import <RiskPerception/HTProtect.h>
#import <RiskPerception/HTProtectConfig.h>
static NSString * const kProductId = @"your_product_id";
- (void)setupRiskControl {
// 仅在用户已同意隐私协议后初始化
if (![self hasAgreedPrivacyPolicy]) {
return;
}
HTProtectConfig *config = [[HTProtectConfig alloc] init];
config.serverType = 1; // 1=中国大陆(默认)
config.channel = @"AppStore";
config.extraData = @{
@"uid": @"123456",
@"bizId": @"10001"
};
[[HTProtect sharedInstance] init:kProductId
config:config
callback:^(int code, NSString *msg, NSString *content) {
if (code == 200) {
// 初始化成功,可获取 Token
} else if (code == 199) {
// 参数错误,检查 productId / config
} else {
// 其他失败,记录 code / msg / content 便于排查
}
}];
}
Swift
import RiskPerception
func setupRiskControl() {
// 仅在用户已同意隐私协议后初始化
guard hasAgreedPrivacyPolicy() else {
return
}
let config = HTProtectConfig()
config.serverType = 1 // 1=中国大陆(默认)
config.channel = "AppStore"
config.extraData = [
"uid": "123456",
"bizId": "10001"
]
HTProtect.sharedInstance().initialize("your_product_id", config: config) { code, msg, content in
if code == 200 {
// 初始化成功,可获取 Token
} else if code == 199 {
// 参数错误,检查 productId / config
} else {
// 其他失败,记录 code / msg / content 便于排查
}
}
}
5. HTProtectConfig 配置说明
HTProtectConfig 的配置项均为可选,按需设置。若 config 传 nil,SDK 使用默认配置。
| 属性 | 说明 | 默认 / 备注 |
|---|---|---|
serverType |
设置服务器所属地区 | 默认中国大陆服务 |
channel |
设置渠道信息,例如 App Store、企业渠道等 | 可选 |
host |
设置服务访问域名 | 私有化、测试环境或指定服务域名时使用 |
extraData |
设置额外透传信息 | key 和 value 均应为字符串 |
5.1 serverType 取值
以下取值用于选择服务区域。使用中国台湾或海外服务前,请先完成对应服务区域开通。
| 取值 | 地区 | 说明 |
|---|---|---|
1 |
中国大陆地区 | 默认值,无须设置 |
2 |
中国台湾地区 | 需开通对应服务区域 |
3 |
海外地区 | 需开通对应服务区域 |
5.2 扩展字段设置
Objective-C:
HTProtectConfig *config = [[HTProtectConfig alloc] init];
config.extraData = @{
@"uid": @"12345",
@"bizId": @"1"
};
Swift:
let config = HTProtectConfig()
config.extraData = [
"uid": "12345",
"bizId": "1"
]
5.3 私有化地址设置
host 可传完整 http/https 地址,也可传域名,SDK 会自动补全 https。
Objective-C:
config.host = @"https://your.server.com";
Swift:
config.host = "https://your.server.com"
6. 获取 Token
前置条件:必须在初始化后再调用。
同步 / 异步如何选择:
- 同步
getToken:不能在主线程调用。接口优先检查缓存 Token 是否仍在初始化响应下发的缓存时长内;缓存有效时,对缓存 Token 二次加密后立即返回,同时在后台异步刷新 Token;无缓存或缓存已过期时,立即返回降级 Token,同时触发后台异步刷新;- 异步
getTokenAsync:每次调用都实时采集设备 / 风险数据并上报,完成后通过回调返回最新 Token,属于耗时操作。注意事项:
GetTokenCallback不能为空;- 同步接口不要在主线程调用;
- 获取到 Token 后,应随业务请求传给业务服务端,再由业务服务端调用易盾服务端校验。
初始化响应会下发 Token 缓存时长 cacheTime,默认 60 秒,具体值以服务端配置为准;缓存不会持久化到 App 本地存储。
6.1 方法定义
Objective-C:
- (AntiCheatResult *)getToken;
- (void)getTokenAsync:(GetTokenCallback)callback;
Swift:
HTProtect.sharedInstance().getToken()
HTProtect.sharedInstance().getTokenAsync(_:)
6.2 异步获取
Objective-C
[[HTProtect sharedInstance] getTokenAsync:^(AntiCheatResult *result) {
if (result.code == 200 && result.token.length > 0) {
NSString *token = result.token;
// 每次实时采集并上报,属于耗时操作;注意兼容离线 token ~5KB
} else {
// 失败,参照第 7 章结果码表(result.code / result.codeStr)
}
}];
Swift
HTProtect.sharedInstance().getTokenAsync { result in
if result.code == 200, !result.token.isEmpty {
let token = result.token
// 每次实时采集并上报,属于耗时操作;注意兼容离线 token ~5KB
} else {
// 失败,参照第 7 章结果码表(result.code / result.codeStr)
}
}
6.3 同步获取
Objective-C
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
AntiCheatResult *result = [[HTProtect sharedInstance] getToken];
if (result.code == 200 && result.token.length > 0) {
NSString *token = result.token;
// 优先返回有效缓存的二次加密结果;同时在后台异步刷新 token
} else {
// 无缓存或缓存已过期时返回降级 token;同时触发后台异步刷新
}
});
Swift
DispatchQueue.global().async {
let result = HTProtect.sharedInstance().getToken()
if result.code == 200, !result.token.isEmpty {
let token = result.token
// 上报 token
} else {
// 处理错误,参照第 7 章
}
}
7. 获取 Token 的返回值(AntiCheatResult)
7.1 AntiCheatResult 类结构
@interface AntiCheatResult : NSObject
@property (nonatomic, copy) NSString *token;
@property (nonatomic, copy) NSString *businessId;
@property (nonatomic, assign) int code;
@property (nonatomic, copy) NSString *codeStr;
@end
7.2 字段说明
| 字段 | 说明 |
|---|---|
code |
结果码,200 表示成功,其余均为失败 |
codeStr |
结果码对应的文字说明 |
token |
code==200 时返回 token;网络不佳或超时时可能返回离线 token |
businessId |
预留字段 |
7.3 结果码(code)说明
| code | codeStr | 含义 | 建议处置 |
|---|---|---|---|
200 |
success |
调用成功 | 正常使用 token |
201 |
error not init |
SDK 未初始化 | 确认初始化成功后再取 token |
202 |
error. run on main thread |
在主线程运行同步接口 | 将 getToken 放到子线程执行 |
203 |
businessId invalid |
businessId 不合法 | 新接口无需传 businessId;若出现请记录日志反馈 |
204 |
gen token error |
其他原因导致生成 token 失败 | 重试;持续失败按 9.4 收集信息反馈 |
7.4 token 长度与离线 token
| 情况 | token 类型 | 大致长度 |
|---|---|---|
| 正常(网络可用) | 在线 token | 默认 40 字节 |
| 网络异常 / 超时 / 降级 | 离线 token | 5KB 左右 |
重要:
- 业务侧不要对 token 长度做硬编码限制 / 截断,需同时兼容 40 字节的在线 token 与约 5KB 的离线 token;
- 上报字段、数据库列、网络包大小限制等都应预留足够空间,避免离线 token 被截断导致服务端校验失败;
- 离线 token 仍可正常上报,由易盾服务端识别处理,无需业务侧区分在线/离线。
8. 通用查询接口(ioctl)
8.1 方法定义
Objective-C:
- (NSString *)ioctl:(RequestCmdID)request withData:(NSString *)data;
Swift:
HTProtect.sharedInstance().ioctl(_:withData:)
8.2 参数说明
| 参数 | 说明 | 是否必填 |
|---|---|---|
request |
查询命令 | 是 |
data |
查询参数,保留参数可传空字符串 | 否 |
8.3 支持命令
| 命令 | 值 | 说明 |
|---|---|---|
Cmd_GetHTPVersion |
7 |
获取 SDK 版本 |
Cmd_GetDeviceId |
20 |
获取服务端设备指纹,需后台开通 |
iOS SDK 支持以上两个查询命令。不支持的查询返回空字符串。
8.4 示例代码
Objective-C:
NSString *sdkVersion = [[HTProtect sharedInstance] ioctl:Cmd_GetHTPVersion withData:@""];
NSString *deviceId = [[HTProtect sharedInstance] ioctl:Cmd_GetDeviceId withData:@""];
Swift:
let sdkVersion = HTProtect.sharedInstance().ioctl(Cmd_GetHTPVersion, withData: "")
let deviceId = HTProtect.sharedInstance().ioctl(Cmd_GetDeviceId, withData: "")
9. 接入指引
9.1 调用时序总览
sequenceDiagram
participant App as App
participant SDKAPI as 易盾风控SDK接口层
participant SDKCore as 易盾风控SDK底层
participant YD as 易盾服务端
Note over App,SDKCore: 用户同意隐私协议后,接口调用触发 SDK 加载
App->>SDKAPI: initialize(productId, config)
SDKAPI->>SDKCore: 触发 SDK 加载与初始化
SDKCore->>YD: 初始化握手 / 拉取在线配置
YD-->>SDKCore: 初始化响应(业务配置、Token 缓存时长,默认 60 秒)
SDKCore->>SDKCore: 保存业务配置并记录 Token 缓存时长
SDKCore-->>SDKAPI: SDK 加载完成
Note over SDKAPI,SDKCore: 后续 Token 接口复用已加载组件
SDKAPI-->>App: HTPCallback(code, msg, content)
Note over App,SDKCore: 业务接口调用触发 Token 获取
App->>SDKAPI: getToken(同步,放在子线程)
SDKAPI->>SDKCore: 触发同步 Token 获取
SDKCore->>SDKCore: 检查缓存 Token 是否超过缓存时长
alt 缓存有效
SDKCore->>SDKCore: 对缓存 Token 二次加密
SDKCore-->>SDKAPI: AntiCheatResult(缓存 Token)
SDKAPI-->>App: 立即返回缓存 Token
else 无缓存或缓存已过期
SDKCore->>SDKCore: 生成降级 Token
SDKCore-->>SDKAPI: AntiCheatResult(降级 Token)
SDKAPI-->>App: 立即返回降级 Token
end
Note over SDKAPI,SDKCore: 同步 getToken 返回后,底层同时执行后台异步刷新
SDKCore->>SDKCore: 实时采集设备 / 风险数据
SDKCore->>YD: 上报采集数据并请求新 Token
YD-->>SDKCore: 返回新 Token
SDKCore->>SDKCore: 按 Token 缓存时长更新内存缓存
App->>SDKAPI: getTokenAsync(callback)(异步,耗时)
SDKAPI->>SDKCore: 触发实时 Token 获取
SDKCore->>SDKCore: 每次实时采集设备 / 风险数据
SDKCore->>YD: 上报采集数据并请求最新 Token
YD-->>SDKCore: 返回最新 Token
SDKCore->>SDKCore: 按 Token 缓存时长更新内存缓存
SDKCore-->>SDKAPI: AntiCheatResult(最新 Token)
SDKAPI-->>App: callback(最新 Token)
时序图中的 Token 缓存时长由初始化响应下发,默认 60 秒;仅当缓存 Token 未超过该时长时,
getToken才会走缓存二次加密分支。
9.2 推荐接入流程
- 向运营获取
productId(必传); - 在隐私政策弹窗中加入易盾智能风控 SDK 采集授权说明;
- 用户同意隐私协议后,构建
HTProtectConfig并调用初始化接口; - 初始化回调
code==200后,在业务节点通过getTokenAsync实时采集并上报 Token(耗时操作); - 对时延敏感的业务可在子线程使用
getToken获取 Token:缓存有效时二次加密后立即返回,缓存无效时返回降级 Token,并同时触发后台刷新; - 客户端将 Token 随业务请求完整上报至业务服务端;服务端后续处理不属于客户端接入范围。
9.3 接入建议
- 必须在用户同意隐私政策后再初始化;
- 初始化接口必须先于所有其他接口调用;
getToken不要在主线程调用;GetTokenCallback不要传nil;HTProtectConfig尽量在初始化前配置完整;- 客户端职责止于获取并上报 Token,不在客户端执行风控校验或决策。
9.4 排查信息收集清单
排查接入问题时,建议先收集以下信息:
| 信息项 | 说明 |
|---|---|
| SDK 包版本 | SDK 版本,以及 ioctl(Cmd_GetHTPVersion) 返回值 |
| XCFramework 信息 | RiskPerception.xcframework、架构、是否真机/模拟器 |
| 设备信息 | 机型、iOS 版本、CPU 架构 |
| 复现步骤 | 触发问题的接口调用顺序 |
| 返回值 | code / codeStr / msg / content |
| 日志 | init 回调日志、异常堆栈、控制台关键日志 |
10. 如何验证接入成功
按以下清单逐步自检,全部通过即视为接入成功。
10.1 编译与打包验证
| 检查项 | 通过标准 |
|---|---|
| Framework 依赖 | 编译无报错,能引用到 HTProtect、HTProtectConfig、AntiCheatResult |
| 架构 | 真机包包含 arm64,模拟器可使用 arm64/x86_64 |
| 隐私清单 | PrivacyInfo.xcprivacy 随 framework 正常进入产物 |
| 旧接口 | 新代码未使用 NTESRiskUniPerception / NTESRiskUniConfiguration |
10.2 初始化验证
- 初始化回调返回
code == 200; - 若返回
199:检查productId/ config 入参; - 若返回其他失败:记录
code、msg、content后进入异常排查流程。
Objective-C:
[[HTProtect sharedInstance] init:@"your_product_id" config:config callback:^(int code, NSString *msg, NSString *content) {
NSLog(@"HTProtect init code=%d, msg=%@, content=%@", code, msg, content);
// 期望看到 code=200
}];
Swift:
HTProtect.sharedInstance().initialize("your_product_id", config: config) { code, msg, content in
print("HTProtect init code=\(code), msg=\(msg), content=\(content)")
// 期望看到 code=200
}
10.3 获取 Token 验证
- 调用
getTokenAsync,回调返回result.code == 200且result.token非空; - 打印长度确认:正常网络下约 40 字节;断网/弱网下可能为 离线 token(~5KB),二者均属正常。
Objective-C:
[[HTProtect sharedInstance] getTokenAsync:^(AntiCheatResult *result) {
NSLog(@"code=%d, codeStr=%@, len=%lu",
result.code,
result.codeStr,
(unsigned long)result.token.length);
}];
Swift:
HTProtect.sharedInstance().getTokenAsync { result in
print("code=\(result.code), codeStr=\(result.codeStr), len=\(result.token.count)")
}
10.4 通用查询验证
调用 ioctl 查询 SDK 版本和服务端设备指纹:
Objective-C:
NSString *sdkVersion = [[HTProtect sharedInstance] ioctl:Cmd_GetHTPVersion withData:@""];
NSString *deviceId = [[HTProtect sharedInstance] ioctl:Cmd_GetDeviceId withData:@""];
Swift:
let sdkVersion = HTProtect.sharedInstance().ioctl(Cmd_GetHTPVersion, withData: "")
let deviceId = HTProtect.sharedInstance().ioctl(Cmd_GetDeviceId, withData: "")
10.5 Token 上报验证
- 客户端能将 token 随业务请求完整上报至业务服务端;
- 业务服务端能正常接收 token,且在线 / 离线 token 均未被截断;
- 服务端后续风控处理不属于客户端接入范围。
10.6 接入成功判定
同时满足以下条件,即接入成功:
- init 回调
code == 200; - getToken 回调
code == 200且 token 非空; - 在线/离线 token 均能完整上报、不被截断;
- 业务服务端能完整接收客户端上报的 token。
11. FAQ / 异常排查
11.1 初始化相关
Q:调用初始化后没有任何回调 / 回调 code 非 200?
排查顺序:
- 确认
productId是否正确; - 确认
host(如配置)是否可达; - 确认 callback 未传
nil,否则无法接收初始化结果; - 确认是否在用户同意隐私协议之后调用。
Q:可以重复调用初始化接口吗?
不建议,请保证初始化只执行一次。若确需切换服务区域或配置,请在初始化前完成服务区域与配置规划。
11.2 获取 Token 相关
Q:如何选择同步还是异步调用?
- 同步
getToken:缓存 Token 在缓存时长内时二次加密后立即返回;无缓存或缓存已过期时返回降级 Token,并同时触发后台异步刷新。必须放子线程; - 异步
getTokenAsync:每次实时采集数据并上报,完成后通过回调返回最新 Token,属于耗时操作。
Q:getTokenAsync 回调返回 code == 201(error not init)?
说明 SDK 尚未初始化或初始化未完成:
- 确认初始化接口已先于
getTokenAsync调用; - 建议在初始化成功(
code==200)后再触发首次取 Token。
Q:同步 getToken 返回 code == 202?
说明同步接口在主线程调用。请放到后台线程执行。
11.3 工程集成相关
Q:编译时报找不到 RiskPerception 或 HTProtect?
- 确认
RiskPerception.xcframework已添加到 App Target; - 确认 Swift 工程已
import RiskPerception; - Objective-C 工程确认已导入对应 SDK 头文件;
- 如使用桥接头,确认 Bridging Header 路径配置正确。
Q:为什么不使用 NTESRiskUniPerception?
旧主接口已废弃。新接入请统一使用 HTProtect。
11.4 误封 / 误判相关
Q:SDK 会不会直接封禁用户?
不会。SDK 侧不做封禁决策,最终是否拦截、如何处置,由业务服务端结合易盾返回的风险标签自行决定。
Q:token 校验失败(code != 200)是否等于用户有问题?
不是。code != 200 多数是环境 / 网络 / 时序问题,并非用户作弊。请先按 7.3 结果码表排查技术原因,不要直接对用户做处置。
11.5 性能 / 稳定性影响相关
Q:接入后会不会拖慢 App 启动 / 卡顿?
- 初始化会保存产品上下文、应用配置、拉取在线配置,并在初始化成功后触发一次后台 Token 预取;
- 同步
getToken优先返回缓存或降级 Token,并在后台异步刷新; - 异步
getTokenAsync每次实时采集并上报,属于耗时操作,回调在完成后触发; - 同步
getToken不能在主线程调用。
Q:取 token 可以高频调用吗?
不建议。请在关键业务节点按需获取,不要在循环或高频回调中反复调用。
11.6 数据获取与处理相关
Q:SDK 会主动申请系统权限吗?
不会。SDK 自身不主动弹窗申请系统权限。如业务 App 自身需要申请权限,请按业务合规要求完成告知与授权。
Q:必须在用户同意隐私政策后才能初始化吗?
是,这是强制要求。必须在用户同意隐私政策后再初始化 SDK,并在隐私政策弹窗中加入本 SDK 的采集授权说明。
Q:海外 / GDPR 场景需要注意什么?
可通过海外数据中心确保数据在合规区域处理。接入海外服务前,请完成对应服务区域开通。
12. AI 辅助接入 Prompt 约束
你是「易盾智能风控 SDK-iOS」接入助手。请严格依据本接入文档回答与生成代码,遵守以下约束:
【API 白名单(仅可使用以下新接口)】
- [HTProtect sharedInstance]
- [[HTProtect sharedInstance] init:productId config:config callback:callback]
- HTProtect.sharedInstance().initialize(_:config:callback:)
- [[HTProtect sharedInstance] getToken] / HTProtect.sharedInstance().getToken()
- [[HTProtect sharedInstance] getTokenAsync:callback] / HTProtect.sharedInstance().getTokenAsync(_:)
- [[HTProtect sharedInstance] ioctl:request withData:data] / HTProtect.sharedInstance().ioctl(_:withData:)
- HTProtectConfig 属性:serverType / host / channel / extraData
- AntiCheatResult 字段:token / businessId / code / codeStr
- RequestCmdID:Cmd_GetHTPVersion / Cmd_GetDeviceId
不得调用旧接口 NTESRiskUniPerception / NTESRiskUniConfiguration;
不得编造 Cmd_SetConfigData 或其他未公开 RequestCmdID;
如涉及未列出的能力,请明确回复「文档未提供该 API」。
【关键事实(不得偏离)】
- 成功码统一为 code == 200;其余 code(201/202/203/204)均为失败。
- 结果对象为 AntiCheatResult,判断成功用 result.code == 200,禁止使用 ret 等旧写法。
- 初始化响应包含 Token 缓存时长:cacheTime 默认 60 秒,具体值以服务端配置为准;不会持久化到 App 本地存储。
- 同步 getToken:不能在主线程调用;缓存 Token 在缓存时长内时二次加密后立即返回,无缓存或缓存已过期时返回降级 Token,并同时触发后台异步刷新。
- 异步 getTokenAsync:每次实时采集数据并上报,属于耗时操作,完成后回调返回最新 Token。
- init 必须满足:用户已同意隐私政策、先于其他接口调用;回调 code==200 后方可取 token。
- token 长度:在线约 40 字节,离线约 5KB;禁止对 token 做长度限制或截断。
- HTProtectConfig 除 init 的 productId 外全部可选;host 仅私有化、测试环境或指定服务域名需要。
- iOS SDK 的 ioctl 仅支持 Cmd_GetHTPVersion / Cmd_GetDeviceId。
- SDK 不做封禁决策、不主动申请系统权限。
【输出要求】
- 生成代码须区分 Objective-C 与 Swift;同步取 token 的示例必须放在子线程。
- 涉及合规/采集字段问题时,按隐私合规指引(2.1)与 iOS 隐私清单要求(2.2)回答,不臆造采集字段。
- API 白名单未列出的能力,明确回复「文档未提供该 API」,不做猜测性回答。

