# 集成要求
# 合规说明
请注意,在贵司的App中集成同盾提供的SDK产品时:
1.1 根据《网络安全法》《电信条例》《电信和互联网用户个人信息保护规定》等相关法律法规要求及监管实践中的标准,在贵司的最终用户首次启动App并在贵司开始采集信息之前,贵司应以交互界面或设计(如隐私政策弹窗等)向最终用户完整告知收集、使用、与第三方共享最终用户个人信息的目的、方式和范围,并征得最终用户的明示同意。
1.2 为向贵司提供业务安全和风控服务,同盾SDK将采集、处理、使用用户的手机终端唯一标志信息(IMEI/IDFA)、Android ID、IMSI、MEID、MAC 地址、SIM 卡序列号、设备序列号、设备类型、设备型号、系统类型、地理位置、登录 IP 地址等设备信息。为确保贵司使用相关服务的合规性,前述隐私政策应涵盖对同盾SDK提供服务并采集、处理、使用相关信息的授权,以下条款内容供贵司参考,具体表述可由贵司根据贵司隐私协议的整体框架和内容自行确定:
同盾SDK:为了业务安全和风控,我司使用了同盾 SDK,该 SDK 需要获取您的手机终端唯一标志信息(IMEI/IDFA)、Android ID、IMSI、MEID、MAC 地址、SIM卡序列号、设备序列号、设备类型、设备型号、系统类型、地理位置、登录 IP 地址、应用程序列表、运行中进程信息、传感器(光传感器、重力传感器、磁场传感器、加速度传感器、陀螺仪传感器)相关设备信息,用于设备欺诈风险识别。 |
同盾隐私协议:https://www.tongdun.cn/other/privacy/id=1 (opens new window)
# 环境要求
条目 | 说明 |
---|---|
兼容版本 | iOS9.0+ |
支持架构 | armv7, arm64, x86_64 |
# 集成步骤
# CocoaPods集成
- 在 Podfile 文件中对应 target 中新增
pod 'TrustDecisionPro', '4.2.4.2'
- 在 Podfile 所在文件夹中执行
pod install --repo-update
命令 (M1系列mac电脑需要执行arch -x86_64 pod install --repo-update
命令)
# SDK目录
Pods/TrustDecisionPro 文件夹下存在如下文件:
- TDMobRisk.framework(终端SDK主文件,静态库类型)
- TDCorePlugin.framework (终端SDK依赖核心插件,Embed动态库类型)
# 引入头文件
在调用的位置引入头文件 Objective C
#import <TDMobRisk/TDMobRisk.h>
Swift
import TDMobRisk
# SDK初始化
注意事项
安装后首次启动时,在用户同意隐私协议后,再进行SDK初始化。 避免出现用户未同意隐私协议就进行SDK初始化采集,引发合规风险事故。
接口定义
void (*initWithOptions)(NSDictionary *options);
示例代码 Objective C
- (void)initTrustDecisionSDK:(void (^)(NSString *blackbox))callback {
TDMobRiskManager_t *riskManager = [TDMobRiskManager sharedManager];
NSMutableDictionary *options = [NSMutableDictionary dictionary];
/*************************** 必传 ***************************/
// 合作方编码,如tongdun,参考下面`必传配置`
[options setValue:@"请输入您的合作方编码" forKey:@"partner"];
// 同盾平台注册的应用标识,参考下面`必传配置`
[options setValue:@"请输入您的appKey" forKey:@"appKey"];
// 同盾平台注册的应用名称,参考下面`必传配置`
[options setValue:@"请输入您的appName" forKey:@"appName"];
// 国家地区参数,参考下面`必传配置`
[options setValue:@"请输入您所在的国家地区" forKey:@"country"];
/*************************** 选传 ***************************/
#ifdef DEBUG
// !!! DEBUG模式下若不设置此参数,app运行会闪退
[options setValue:@"allowed" forKey:@"allowed"];
#endif
[options setValue:^(NSString *blackbox) {
// 此处回调在子线程
// 网络正常的情况下,会在200-300ms内返回结果。
// 网络异常的情况下,会在超时时间timeLimit(默认最长15s)后返回。
// 请在下方添加您对blackbox的处理逻辑
if (callback) {
callback(blackbox);
}
} forKey:@"callback"];
riskManager->initWithOptions(options);
}
Swift
func initTrustDecisionSDK(callback: @escaping (_ blackBox:String) -> Void) {
let riskManager = TDMobRiskManager.sharedManager()
var options = [String : NSObject]()
/*************************** 必传 ***************************/
// 合作方编码,如tongdun,参考下面`必传配置`
options.updateValue("请输入您的合作方编码" as NSObject, forKey: "partner")
// 同盾平台注册的应用标识,参考下面`必传配置`
options.updateValue("请输入您的appKey" as NSObject, forKey: "appKey")
// 同盾平台注册的应用名称,参考下面`必传配置`
options.updateValue("请输入您的appName" as NSObject, forKey: "appName")
// 国家地区参数,参考下面`必传配置`
options.updateValue("请输入您所在的国家地区" as NSObject, forKey: "country")
/*************************** 选传 ***************************/
#if DEBUG
// !!! DEBUG模式下若不设置此参数,app运行会闪退
options.updateValue("allowed" as NSObject, forKey: "allowed")
#endif
let tdcallback: (String)-> Void = {blackBox in
// 此处回调在子线程
// 网络正常的情况下,会在200-300ms内返回结果。
// 网络异常的情况下,会在超时时间timeLimit(默认最长15s)后返回。
// 请在下方添加您对blackbox的处理逻辑
callback(blackBox)
}
options["callback"] = unsafeBitCast(tdcallback as @convention(block) (String) -> Void, to: AnyObject.self) as? NSObject
riskManager?.pointee.initWithOptions(options)
}
必传配置
配置 key | 定义 | 说明 | 场景 | 示例代码 |
---|---|---|---|---|
partner | 合作方编码 | 同盾的合作方编码,请联系同盾运营获取 | 所有场景 | Objective C [options setValue:@"请输入您的合作方编码" forKey:@"partner"]; Swift options.updateValue("请输入您的合作方编码" as NSObject, forKey: "partner") |
appKey | 应用标识 | 同盾生成的应用标识,和app绑定,用于校验app的有效性,请联系同盾运营获取 appkey创建需要用户提供应用包名、小写的sha256 签名。 ⚠️不同应用的包名签名不要使用相同的值 | 所有场景 | Objective C [options setValue:@"请输入您的appKey" forKey:@"appKey"]; Swift options.updateValue("请输入您的appKey" as NSObject, forKey: "appKey") |
appName | 应用名称 | 同盾平台注册的应用名称,请联系同盾运营获取 | 所有场景 | Objective C [options setValue:@"请输入您的appName" forKey:@"appName"]; Swift options.updateValue("请输入您的appName" as NSObject, forKey: "appName") |
country | 国家地区 | 国家地区参数,如cn sg us fra | 根据国家地区填写对应参数。 cn代表中国, sg代表新加坡, us代表北美, fra代表欧洲 | Objective C [options setValue:@"请输入您所在的国家地区" forKey:@"country"]; Swift options.updateValue("请输入您所在的国家地区" as NSObject, forKey: "country") |
# 获取SDK版本号
示例代码 Objective C
// 获取SDK版本号
TDMobRiskManager_t *riskManager = [TDMobRiskManager sharedManager];
NSString *sdkVersion = riskManager->getSDKVersion();
Swift
// 获取SDK版本号
let riskManager = TDMobRiskManager.sharedManager()
let sdkVersion = riskManager?.pointee.getSDKVersion()
# 设备指纹功能模块
# initWithOptions选传参数
配置 key | 定义 | 说明 | 场景 | 示例代码 |
---|---|---|---|---|
allowed | SDK反调试配置 | 集成SDK后App默认具有反调试功能,开发者根据具体情况进行对应设置 | **开发阶段:**Xcode调试请打开此配置 **打包测试/上架阶段:**移除此配置 | Objective C [options setValue:@"allowed" forKey:@"allowed"]; Swift options.updateValue("allowed" as NSObject, forKey: "allowed") |
timeLimit | SDK超时时间配置(单位:秒) | SDK初始化采集上报后,网络请求回调的超时时间,SDK默认为15s | 开发者需要控制SDK上报以后的网络请求超时时间,请设置此配置 | Objective C [options setValue:@"5" forKey:@"timeLimit"]; Swift options.updateValue("5" as NSObject, forKey: "timeLimit") |
noLocation | SDK地理定位信息采集配置 | SDK本身不主动进行定位授权,完全依赖App的权限 | 禁止SDK获取定位信息,请设置此配置 | Objective C [options setValue:@"noLocation" forKey:@"noLocation"]; Swift options.updateValue("noLocation" as NSObject, forKey: "noLocation") |
noIDFA | SDK广告标识符(IDFA)采集配置 | SDK本身不主动进行广告标识符授权,完全依赖App的权限设置此配置后,可以通过苹果对于广告标识符的静态扫码检查 | 禁止SDK获取和执行广告标识符(IDFA)相关代码,请设置此配置 | Objective C [options setValue:@"noIDFA" forKey:@"noIDFA"]; Swift options.updateValue("noIDFA" as NSObject, forKey: "noIDFA") |
noDeviceName | 设备名称(deviceName)采集配置 | 集成SDK后,SDK默认会采集当前设备名称,开发者根据具体情况进行对应设置 | 禁止SDK采集设备名称,请设置此配置 | Objective C [options setValue:@"noDeviceName" forKey:@"noDeviceName"]; Swift options.updateValue("noDeviceName" as NSObject, forKey: "noDeviceName") |
callback | SDK异步回调配置 | SDK初始化采集上报后,根据网络请求结果返回blackbox。 请求成功: 返回非降级blackbox 请求失败: 返回降级blackbox | 尽可能获取到非降级blackbox | Objective C [options setValue:^(NSString *blackbox) {} forKey:@"callback"]; Swift let callback: (String)-> Void = {blackBox in } options["callback"] = unsafeBitCast(callback as @convention(block) (String) -> Void, to: AnyObject.self) as? NSObject |
collectLevel | 降级blackbox采集字段长度配置 | 降级的blackbox会较长。通过此配置可控制降级的blackbox长度 | 需要blackbox长度较短时建议使用此配置 不设置: 降级blackbox长度为5000个字符左右(根据实际设备情况会有上浮) **设置:**降级blackbox长度为2000个字符左右 | Objective C [options setValue:@"M" forKey:@"collectLevel"]; Swift options.updateValue("M" as NSObject, forKey: "collectLevel") |
# 获取blackbox
注意事项
- 请在
initWithOptions
后getBlackBox
,否则会引起SDK异常 - 建议开发者不要在App内对
getBlackBox
返回的结果进行缓存,获取blackbox请依赖此函数
示例代码 Objective C
// 同步获取blackbox,未进行SDK初始化禁止调用,否则会引起SDK异常。
TDMobRiskManager_t *riskManager = [TDMobRiskManager sharedManager];
NSString *blackbox = riskManager->getBlackBox();
Swift
// 同步获取blackbox,未进行SDK初始化禁止调用,否则会引起SDK异常。
let riskManager = TDMobRiskManager.sharedManager()
let blackBox = riskManager?.pointee.getBlackBox()
# FAQ
Q1:引入终端SDK后,工程无法再进行 Xcode 调试,如何解决?
A1:请参考 SDK初始化 (opens new window) 在终端SDK初始化时,加入如下参数 Objective C
[options setValue:@"allowed" forKey:@"allowed"];
Swift
options.updateValue("allowed" as NSObject, forKey: "allowed")