设备风险 SDK iOS 接入

更新时间:
复制为 MD 格式

本文介绍了阿里云设备风险识别 iOS SDK 的接入流程。

前提条件

重要

为帮助落实针对您产品集成第三方 SDK 情况所应履行的隐私合规义务,降低隐私违规风险,进而实现您产品合规运营的业务目标,请您务必确保选用阿里云文档中心官网发布的最新版本产品。在使用设备风险识别前,请您务必仔细了解个人信息处理规定及《风险识别 SDK 隐私权政策》,并按照《SDK 合规使用说明》进行接入。

  • iOS 系统版本为 9.0 及以上。

权限说明

为增强风险识别效果,在 App Store 上架之前,请确保 App 已经在 Info.plist 中添加如下字段及说明信息,否则可能会导致上架失败。

权限

是否必选

备注

NSLocalNetworkUsageDescription

否(推荐赋予)

获取局域网内设备连通性,用于发现设备牧场、群控等风险。

NSLocationWhenInUseUsageDescription

否(推荐赋予)

获取设备位置信息,用于发现虚拟定位等风险。

NSUserTrackingUsageDescription

否(推荐赋予)

用于获取 IDFA 信息,对增强设备指纹稳定性有一定效果。

依赖配置

  1. 下载 iOS SDK(SDK 为 XCode 上标准静态 framework 包),并在下载 SDK 的控制台中生成 AppKey。

    说明
    • 单架构的 framework 文件在 2.5M 左右。

    • 设备风险 SDK 为了保证自身的抗逆向性以及数据在网络传输过程中的安全性,SDK 中有大量的插花、膨胀及加解密操作,所以 SDK 体积会相对较大。

  2. 将 SDK 包中的 deviceiOS.framework 复制到 iOS 工程目录下。

  3. 选择工程配置,定位到 Build Phases -> Link Binary With Libraries,添加 deviceiOS.framework 及其依赖包:

    deviceiOS.framework
    CoreTelephony.framework
    CoreLocation.framework
    Security.framework
    libresolv.tbd
    libz.tbd
    libc++.tbd
    // 使用 IDFA 版本需要添加
    AppTrackingTransparency.framework
    AdSupport.framework
  4. 请根据自身业务属性,选择是否带有 idfa 等敏感数据采集功能的 SDK,具体参考 SDK 下载列表描述。

调用 SDK

初始化 SDK 采集数据

SDK 内部初始化与数据采集,务必确保用户同意《风险识别 SDK 隐私权政策》之后,在风险场景尽早通过阿里云设备风险识别 SDK 采集数据。

  • 函数原型

@interface SecurityDevice : NSObject
/**
 *  设备指纹初始化函数
 */
- (void)initDevice:(NSString *)userAppKey :(void (^)(int))initCallback;

/**
 * 带参数的初始化
 */
- (void)initDevice:(NSString *)userAppKey withOptions:(NSMutableDictionary *)options callback:(void (^)(int))initCallback;

@end
  • userAppKey:用于标识用户身份,阿里云分配的产品 AppKey(不同于 AK),可在阿里云控制台的设备 App 管理申请获取。

  • options:信息采集可选项,默认可以为 nil。可选参数如下:

字段名

说明

示例

IPv6

是否使用 IPv6 域名上报设备信息。

  • 0(默认):使用 IPv4 域名。

  • 1:使用 IPv6 域名。

"1"

CustomUrl

设置数据上报服务器域名。

"https://cloudauth-device.aliyuncs.com"

CustomHost

设置数据上报服务器 Host。

"cloudauth-device.aliyuncs.com"

说明

指定站点上报,需要设置 CustomUrlCustomHost 为国内指定地域,默认情况不需要设置。

endpoints 默认服务地址:

  • initCallback:初始化回调监听接口,可在回调中判断初始化是否成功,默认可以为 nil。其中,code 字段取值范围参考"状态返回值"。

  • 返回值:无。

  • 调用示例

NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setValue:@"0" forKey:@"IPv6"];       // 设置 IPv4
// 设置自定义的数据上报地域
// [options setValue:@"xxx" forKey:@"CustomUrl"];  设置上报站点 Url
// [options setValue:@"xxx" forKey:@"CustomHost"]; 设置上报站点 Host

// 标准调用(推荐)
[[SecurityDevice sharedInstance] initDevice:@"******" withOptions:options callback:nil];

// 回调调用
[[SecurityDevice sharedInstance] initDevice:@"******" withOptions:options callback:^(int code) {
    NSString * initResult = [NSString stringWithFormat: @"初始化结果 %d", code];
    NSLog(@"%@", initResult);

    if (SC_SUCCESS != code) {
        NSLog(@"初始化失败");
    } else {
        NSLog(@"初始化成功");
    }
}];

获取客户端 Token

获取客户端 Token,并上报到业务服务器,后续通过服务器端设备风险识别 API 获取设备风险信息。

重要
  • 请确保 initDevice 接口和 getDeviceToken 接口调用时间间隔 2 秒以上

  • 调用 getDeviceToken 时建议传入 bizId,可以将本次 token 和业务唯一 ID 绑定,后在服务端查询结果时将 ID 一起传入,并确保客户端传入 bizId 和服务端传入 ID 一致,可校验 Token 被篡改的风险。

  • 建议在 APP 非主线程上调用 getDeviceToken 接口,以避免接口调用耗时可能导致的崩溃。

  • 函数原型

@interface SecurityDevice : NSObject
- (SecurityToken *)getDeviceToken;
- (SecurityToken *)getDeviceToken:(NSString *)bizId;
@end
  • bizId:客户的业务 ID,可用于关联业务 ID 和 token。默认情况可以不传。

  • 返回值:SecurityToken 类型,定义如下:

@interface SecurityToken : NSObject

/**
 * 获取 Session 操作的结果
 */
@property(atomic) int code;

/**
 * 包含 token 结果的字符串
 */
@property(copy, atomic) NSString *token;

@end
  • code:返回接口调用状态码,可用于判断接口调用是否成功。code 返回值:

    FaceSecCode

    Code

    备注

    SC_SUCCESS

    10000

    SDK 初始化成功。

    SC_NOT_INIT

    10001

    SDK 未初始化。

    SC_NOT_PERMISSION

    10002

    SDK 需要的基础权限未完全授权。

    SC_UNKNOWN_ERROR

    10003

    系统未知错误。

    SC_NETWORK_ERROR

    10004

    网络错误。

    SC_NETWORK_ERROR_EMPTY

    10005

    网络错误,返回内容为空串。

    SC_NETWORK_ERROR_INVALID

    10006

    网络返回的格式非法。

    SC_PARSE_SRV_CFG_ERROR

    10007

    服务端配置解析失败。

    SC_NETWORK_RET_CODE_ERROR

    10008

    网关返回失败。

    SC_APPKEY_EMPTY

    10009

    AppKey 为空。

    SC_PARAMS_ERROR

    10010

    其他参数错误。

    SC_FGKEY_ERROR

    10011

    密钥计算错误。

    SC_APPKEY_ERROR

    10012

    APPKey 无效。

  • token:返回客户端 token 字符串信息,可用于业务后续查询阿里云设备风险识别接口。

重要

token 字符串在网络环境良好的场景下,长度为 600 字节左右;在网络环境较差的场景下,返回的长度在 2.5K 左右,并且带有特殊标识:

  • 国内:有网 "Tkxxxx"、弱网 "UFxxxx";

如果业务上出现了大量的长 token:

  • 首先,请确保客户端的网络是畅通的;

  • 其次,请确保 SDK 的 initDevice 接口和 getDeviceToken 接口调用时间间隔 2 秒以上

每次在需要风险查询的时候,重新获取 token,token 的有效期为 7 天。

  • 调用示例

// 推荐传入 bizId,防止 deviceToken 被篡改
NSString *bizId = @"1234567890abcdef******";
SecurityToken *deviceToken = [[SecurityDevice sharedInstance] getDeviceToken:bizId];

if (deviceToken == nil || SC_SUCCESS != deviceToken.code) {
    NSLog(@"获取 token 失败, 调用结果不可用于风险标签查询");
} else {
    NSLog(@"获取 token 成功, 后续可以正常查询风险标签. Token: %@", deviceToken.token);
}

携带 Token 请求服务端

成功获取 deviceToken 后,可携带此参数请求业务服务器,由服务端查询并校验结果。

完整代码示例

static NSString *USER_APP_KEY = @"<请控制台获取>";

- (void)viewDidLoad {
    [super viewDidLoad];

    // 接入示例
    [self doStandard];
}

- (void)doStandard {
    // 初始化 SDK
    // 在 App 生命周期中只需要调用 1 次
    [self doInit];

    dispatch_async(dispatch_get_global_queue(NULL, NULL), ^{
        // 此处仅模拟等待 2s, 实际业务无需添加
        [NSThread sleepForTimeInterval:2.0];

        // 获取 Token
        [self doGetToken];
    });
}


- (void)doInit {
    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setValue:@"0" forKey:@"IPv6"];         // 设置为 IPv4
    // 设置自定义上报地域
    // [options setValue:@"https://cloudauth-device.aliyuncs.com" forKey:@"CustomUrl"];
    // [options setValue:@"cloudauth-device.aliyuncs.com" forKey:@"CustomHost"];
    [[SecurityDevice sharedInstance] initDevice:USER_APP_KEY withOptions:options callback:nil];
}

- (void)doGetToken {
    // 推荐传入 bizId,防止 deviceToken 被篡改
    NSString *bizId = @"1234567890abcdef******";
    SecurityToken *deviceToken = [[SecurityDevice sharedInstance] getDeviceToken:bizId];

    if (deviceToken == nil || SC_SUCCESS != deviceToken.code) {
        NSLog(@"获取 token 失败, 调用结果不可用于风险标签查询");
    } else {
        NSLog(@"获取 token 成功, 后续可以正常查询风险标签. Token: %@", deviceToken.token);
    }
}
重要
  • 如需要使用 IDFA 或位置信息,根据苹果官方隐私政策规定,除了在 App 的 plist 中声明使用对应权限之外,还需要调用方主动弹框提示用户授权,并且开发环境需要确保是 Xcode 12 以上。

  • 在业务需要风险识别的场景下(如注册、活动推广等)获取客户端 token,并上报到业务的服务器端进行风险查询。

调用风险识别 API 接口

将 deviceToken 与其他参数,参考服务端API接口接入,请求风险识别 API 接口进行识别。

常见问题答疑

关于设备风控 SDK 的常见问题,请参见SDK常见问题