本文介绍了阿里云设备风险识别 iOS SDK 的接入流程。
前提条件
为帮助落实针对您产品集成第三方 SDK 情况所应履行的隐私合规义务,降低隐私违规风险,进而实现您产品合规运营的业务目标,请您务必确保选用阿里云文档中心官网发布的最新版本产品。在使用设备风险识别前,请您务必仔细了解个人信息处理规定及《风险识别 SDK 隐私权政策》,并按照《SDK 合规使用说明》进行接入。
-
iOS 系统版本为 9.0 及以上。
权限说明
为增强风险识别效果,在 App Store 上架之前,请确保 App 已经在 Info.plist 中添加如下字段及说明信息,否则可能会导致上架失败。
|
权限 |
是否必选 |
备注 |
|
NSLocalNetworkUsageDescription |
否(推荐赋予) |
获取局域网内设备连通性,用于发现设备牧场、群控等风险。 |
|
NSLocationWhenInUseUsageDescription |
否(推荐赋予) |
获取设备位置信息,用于发现虚拟定位等风险。 |
|
NSUserTrackingUsageDescription |
否(推荐赋予) |
用于获取 IDFA 信息,对增强设备指纹稳定性有一定效果。 |
依赖配置
-
下载 iOS SDK(SDK 为 XCode 上标准静态 framework 包),并在下载 SDK 的控制台中生成 AppKey。
说明-
单架构的 framework 文件在 2.5M 左右。
-
设备风险 SDK 为了保证自身的抗逆向性以及数据在网络传输过程中的安全性,SDK 中有大量的插花、膨胀及加解密操作,所以 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
初始化 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 域名上报设备信息。
|
"1" |
|
CustomUrl |
设置数据上报服务器域名。 |
"https://cloudauth-device.aliyuncs.com" |
|
CustomHost |
设置数据上报服务器 Host。 |
"cloudauth-device.aliyuncs.com" |
指定站点上报,需要设置 CustomUrl 和 CustomHost 为国内指定地域,默认情况不需要设置。
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常见问题。