# 集成要求

# 合规说明

请注意,在贵司的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

# 环境要求

条目 说明
兼容版本 iOS9.0+
支持架构 armv7, arm64, x86_64

# 集成步骤

# CocoaPods集成

  • 在 Podfile 文件中对应 target 中新增 pod 'TrustDecisionPro', '4.2.4.2'
  • 在 Podfile 文件中对应 target 中新增 pod 'TrustDecisionCaptcha', '2.1.8'
  • 在 Podfile 所在文件夹中执行 pod install --repo-update 命令 (M1系列mac电脑需要执行 arch -x86_64 pod install --repo-update 命令)

# SDK目录

Pods/TrustDecisionPro 文件夹下存在如下文件:

  • TDMobRisk.framework(终端SDK主文件,静态库类型)
  • TDCorePlugin.framework (终端SDK依赖核心插件,Embed动态库类型)

Pods/TrustDecisionCaptcha 文件夹下存在如下文件:

  • libTDCaptcha.a(终端SDK 验证码组件,静态库类型)
  • TDCaptchaResource.bundle (终端SDK 验证码组件需要用到的资源包)

# 引入头文件

在调用的位置引入头文件

#import <TDMobRisk/TDMobRisk.h>

# SDK初始化

注意事项

安装后首次启动时,在用户同意隐私协议后,再进行SDK初始化。

避免出现用户未同意隐私协议就进行SDK初始化采集,引发合规风险事故。

接口定义

void (*initWithOptions)(NSDictionary *options);

示例代码

- (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);

}

必传配置

配置 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版本号

示例代码

// 获取SDK版本号
TDMobRiskManager_t *riskManager = [TDMobRiskManager sharedManager];
NSString *sdkVersion = riskManager->getSDKVersion();

# 验证码功能模块

# initWithOptions选传参数

配置 key 定义 说明 场景 示例代码
language 语言类型 可选项: 1-简体中文、2-繁体中文、3-英 文、4-日文、5-韩文、6-⻢来语、7-泰语、8-印尼语、9-俄 语 默认: 1-简体中文 客户根据需要设置语言类型。 国内支持1-5 海外支持1-9 [options setValue:@"1" forKey:@"language"];
tapToClose 点击空白处是否关闭验证码 可选项: true、false 默认: false 开启后,点击界面空白处,会关闭验证码弹窗,关闭弹窗更加便捷 [options setValue:@(true) forKey:@"tapToClose"];
needSeqid 失败回调信息中是否携带seqid 可选项: true、false **默认:**true 开启后,失败信息中会携带seqid序列号,将seqid提供给同盾,方便排查失败原因 [options setValue:@(true) forKey:@"needSeqid"];
hideLoadHud 是否跳过加载动画 可选项: true、false **默认:**false 开启后,弹出验证码弹窗时不会再显示加载动画,缩短验证时间 [options setValue:@(true) forKey:@"hideLoadHud"];
hideWebCloseButton 是否隐藏webview的关闭按钮 可选项: true、false **默认:**false 需要强制完成验证码验证的场景 [options setValue:@(true) forKey:@"hideWebCloseButton"];
openLog 是否打开log 可选项: true、false **默认:**false 开启后,调试时控制台会输出更多的log信息,方便排查问题 [options setValue:@(true) forKey:@"openLog"];
skipCaptcha 是否跳过同盾验证码验证 可选项: true、false **默认:**false 开启将不会进行验证码的验证,同时返回4000错误码,用于动态设置是否使用同盾验证码SDK验证的场景 [options setValue:@(true) forKey:@"skipCaptcha"];
mfaId MFA产品 可选项: string **默认:**nil 如果您接入了MFA产品(未对接MFA,可忽略该说明),请将MFA流程中获取的 mfaid传递给验证码配置参数 [options setValue:@"mfaId string" forKey:@"mfaId"];

# 弹出验证码弹窗

showCaptcha函数

[TDMobRiskManager sharedManager]->showCaptcha 函数 用于显示验证码弹窗,其接口定义如下

// 显示验证码弹窗
// @param superView 弹窗显示在的父视图,UIView 类型
// @param block 结果回调的block
void (*showCaptcha)(id superView,TongdunShowCaptchaBlock block);

回调参数结构体TongdunShowCaptchaResultStruct

我们使用TongdunShowCaptchaResultStruct 结构体存储回调的结果;

typedef enum {
    // 验证码校验成功,此时可以获取到有效的 validateToken;
    TongdunShowCaptchaResultTypeSuccess,
    // 验证码校验失败,可以获取错误码 errorCode和errorMsg,根据文档中的`错误码`排查原因;
    TongdunShowCaptchaResultTypeFailed,
    // 验证码弹窗成功,等待被验证;
    TongdunShowCaptchaResultTypeReady,
} TongdunShowCaptchaResultType;


typedef struct _TongdunShowCaptchaResultStruct{
    // 返回的结果类型
    TongdunShowCaptchaResultType resultType;
    // 返回成功后,返回的验证码的token
    const char*validateToken;
    // 返回失败后,返回的错误码,可以根据文档排查原因
    NSInteger errorCode;
    // 返回失败后,返回的错误信息
    const char*errorMsg;
}TongdunShowCaptchaResultStruct;

示例代码

- (void)showCaptcha {
    UIWindow * keyWindow = [UIApplication sharedApplication].keyWindow;
    TDMobRiskManager_t *riskManager = [TDMobRiskManager sharedManager];
    riskManager->showCaptcha(keyWindow,^(TongdunShowCaptchaResultStruct resultStruct) {
        switch (resultStruct.resultType) {
            case TongdunShowCaptchaResultTypeSuccess:
            {
                NSString * validateToken = @(resultStruct.validateToken);
                NSLog(@"获取同盾验证码成功!!!,validateToken:%@",validateToken);
            }
                break;
            case TongdunShowCaptchaResultTypeFailed:
            {
                NSString * errorMsg = @(resultStruct.errorMsg);
                NSLog(@"获取同盾验证码失败!!!,errorCode:%ld,errorMsg:%@",resultStruct.errorCode,errorMsg);
            }
                break;
            case TongdunShowCaptchaResultTypeReady:
                NSLog(@"验证码弹窗成功,等待被验证!!!");
                break;
            default:
                break;
        }
    });
}

# 错误码

验证码功能模块的错误码会通过 showCaptcha 函数输出

错误码 错误信息 处理方式
1001 关闭了验证码窗口 弹出验证码后,用户手动取消了验证码,不需要处理
2001 请求参数异常,请检查参数 请检查appName和partnerCode参数
2100 请求参数异常,请检查参数 请检查传递参数
2101 请求参数异常,请检查参数 请求过程出错,请联系运营
2102 请求参数异常,请检查参数 参数缺失,请检查参数
2111 验证⻚面网络错误 稍后再试,或者请联系运营
2112 验证⻚面操作太频繁 稍后再试
2113 未知错误 未知错误,请联系运营
2114 关闭了验证码窗口 点击了验证码关闭按钮,不需要处理
2115 验证⻚面网络错误 网络资源加载失败
2116 验证⻚面网络错误 网络资源加载失败
2202 验证成功 验证结果成功,不需要处理
2301 未购买此服务 请联系运营
2302 流量已被禁用 请联系运营
2303 流量不足 请联系运营
2304 服务已过期 请联系运营
2305 日流量已封顶 请联系运营
2600 系统繁忙,请稍后再试 系统繁忙,请稍后再试
2601 验证失败,稍后重试 验证失败,请稍后重试
2602 验证失败,稍后重试 验证失败,请稍后重试
2603 验证失败,稍后重试 验证失败,请稍后重试
2604 验证失败,稍后重试 刷新频繁,请稍后重试
2605 验证失败,稍后重试 获取验证码信息失败
2702 验证失败,稍后重试 解析错误,请稍后重试
3001 SSL证书校验失败 请关闭网络代理工具
3002 验证页面加载出错 刷新网络后重试
3003 验证⻚面加载超时 检查网络后重试
4000 验证逻辑跳过 开发者手动处理验证跳过逻辑
9000 设备指纹没有挂载 集成验证码需要先集成设备指纹
9001 没有网络 请检查网络连接
9002 请求超时 检查网络,稍后重试
9003 返回结果异常 服务端错误,返回结果异常,联系技术支持
9004 全局加载超时 检查网络,稍后重试

# FAQ

Q1:引入终端SDK后,工程无法再进行 Xcode 调试,如何解决?

A1:请参考 SDK初始化 (opens new window) 在终端SDK初始化时,加入如下参数

[options setValue:@"allowed" forKey:@"allowed"];
: 2023/06/07 16:19:48