本文档介绍了设备风险SDK (iOS)的接入流程。
使用须知
iOS SDK 使用限制如下:
iOS 系统版本为 9.0 及以上。
前提条件
为落实集成第三方 SDK 的隐私合规义务,降低隐私违规风险,请使用阿里云文档中心官网发布的最新版本产品。在使用设备风险识别前,请了解个人信息处理规定及《风险识别 SDK 隐私权政策》,并按照SDK 合规使用说明进行接入。
权限说明
为增强风险识别效果,在 App Store上架之前,请确保 App 已经在Info.plist中添加如下字段及说明信息,否则可能会导致上架失败。
权限 | 是否必选 | 备注 |
NSLocalNetworkUsageDescription | 否(推荐赋予) | 获取局域网内设备连通性,用于发现设备牧场、群控等风险。 |
NSLocationWhenInUseUsageDescription | 否(推荐赋予) | 获取设备位置信息,用于发现虚拟定位等风险。 |
NSUserTrackingUsageDescription | 否(推荐赋予) | 用于获取 IDFA 信息,对增强设备指纹稳定性有一定效果。 |
依赖配置
下载 iOS SDK。SDK 为 Xcode 标准静态 framework 包,请在下载 SDK 的控制台生成 AppKey。
单架构 framework 文件大小约 2.5 MB。
为保证抗逆向能力与网络传输过程中的数据安全,设备风险 SDK 内部包含代码混淆、加解密等安全处理逻辑,因此体积相对较大。
将 SDK 包中的
deviceiOS.framework复制到 iOS 工程目录下。选择工程配置,定位到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请根据自身业务属性,选择是否带有
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:初始化回调监听接口,可在回调中判断初始化是否成功, 默认可以为nil。code字段取值范围参考状态返回值。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)、定位信息。 |
CustomUrl和CustomHost参数说明
指定站点上报,需要设置CustomUrl和CustomHost为指定地域,默认情况不需要设置。
地域 | 地址 |
国内(默认) | 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;
@endtoken 字符串在网络环境良好的场景下,长度为 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);
}
}常见问题
关于设备风控服务接入的常见问题,请参见设备风控服务接入常见问题。