设备风险 SDK iOS 接入

更新时间:
复制 MD 格式

本文档介绍了设备风险SDK (iOS)的接入流程。

使用须知

iOS SDK 使用限制如下:

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

前提条件

  • 为落实集成第三方 SDK 的隐私合规义务,降低隐私违规风险,请使用阿里云文档中心官网发布的最新版本产品。在使用设备风险识别前,请了解个人信息处理规定及《风险识别 SDK 隐私权政策》,并按照SDK 合规使用说明进行接入。

权限说明

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

权限

是否必选

备注

NSLocalNetworkUsageDescription

否(推荐赋予)

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

NSLocationWhenInUseUsageDescription

否(推荐赋予)

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

NSUserTrackingUsageDescription

否(推荐赋予)

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

依赖配置

  1. 下载 iOS SDK。SDK 为 Xcode 标准静态 framework 包,请在下载 SDK 的控制台生成 AppKey。

    • 单架构 framework 文件大小约 2.5 MB。

    • 为保证抗逆向能力与网络传输过程中的数据安全,设备风险 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

完成上述配置后,按以下三个步骤完成客户端接入:

  • 初始化(initDevice)

  • 获取客户端 Token(getDeviceToken)

  • 携带 Token 请求服务端

1.初始化(initDevice)

该函数用于完成SDK初始化和信息采集。在进行风险识别时,需要在满足合规要求的情况下尽可能早地调用。该函数一次APP启动后只需要调用一次。

  • 函数原型

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

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

@end

参数说明

  • userAppKey:用于标识用户身份,可在阿里云控制台的设备 App 管理申请获取。

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

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

字段名

说明

示例

IPv6

是否使用 IPv6 域名上报设备信息。0(默认):使用 IPv4 域名。1:使用 IPv6 域名。

"0"

CustomUrl

设置数据上报服务器域名。指定站点上报时使用,默认不需要设置。

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

CustomHost

设置数据上报服务器 host。需与 CustomUrl 配对使用,默认和 CustomUrl 一起不需要设置。

"cloudauth-device.aliyuncs.com"

DataType

设置不采集设备数据的类型。默认为空(推荐),采集所有数据,具体可配置数据如下表。

COLLECT_NO_EXTRA_DEVICE_DATA

DataType参数说明

采集数据的类型

说明

设备信息字段详情

COLLECT_NO_EXTRA_DEVICE_DATA

设备扩展信息

包括:黑灰产 App 列表、局域网 IP、DNS IP、连接的 WIFI 信息(SSID、BSSID)、定位信息。

CustomUrlCustomHost参数说明

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

地域

地址

国内(默认)

CustomUrl:https://cloudauth-device.aliyuncs.com;CustomHost:cloudauth-device.aliyuncs.com

  • 调用示例

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(@ "初始化成功");
    }
}];

2.获取客户端 Token(getDeviceToken)

获取客户端 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
null

token 字符串在网络环境良好的场景下,长度为 600 字节左右;在网络环境较差的场景下,返回的长度在 2.5K 左右。

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

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

其次,确保 SDK 的initDevice接口和getDeviceToken接口调用时间间隔 2 秒以上,或者在初始化成功回调后调用。

  • 调用示例

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

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

如需要使用IDFA或位置信息,根据苹果官方隐私政策规定,除了在 App 的 plist 中声明使用对应权限之外,还需要调用方主动弹框提示用户授权,并且开发环境需要确保是 Xcode 12 以上

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

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

3.携带 Token 请求服务端

成功获取 deviceToken 后,将 deviceToken 作为参数传至业务服务端。由服务端调用阿里云设备风险识别 API 接口,传入 deviceToken 查询并校验设备风险信息。

状态返回值

SecurityCode

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无效

完整代码示例

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

- (void)viewDidLoad {
    [super viewDidLoad];

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

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

常见问题

关于设备风控服务接入的常见问题,请参见设备风控服务接入常见问题