设备风险SDK iOS接入

本文介绍了阿里云设备指纹iOS SDK接入流程。

前提条件

设备风险SDK需在iOS 9.0及以上的系统版本上运行。

合规条款

1、您需要确保App有《风险识别SDK隐私权政策》,并且在用户首次启动App时就弹出《风险识别SDK隐私权政策》取得用户同意,请勿默认客户已勾选。

2、您务必在《风险识别SDK隐私权政策》中向用户告知使用阿里云设备风险识别SDK,参考条款如下:

  • 使用SDK名称:阿里云设备风险识别SDK;

  • 服务类型:检测篡改设备、模拟器、恶意脚本等异常设备;

  • 收集设备信息:当您使用风险识别产品且接入设备风险识别SDK服务时,为了检测最终用户的设备欺诈与作弊行为,识别设备的真实性,我们会获取最终用户的:

    • 设备基础信息:设备制造商、设备品牌、设备类型及型号、设备名称、设备操作系统信息、设备内存及存储大小、传感器列表、电池及电量信息、基带信息、开机时间、屏幕亮度及分辨率、CPU信息、系统时区、系统语言、充电状态、系统内核信息;

    • 设备标识信息(必要):IDFV;

    • 设备标识信息(可选):IMEI(国际移动识别码)、IMSI(国际移动用户识别码)、MAC地址、ICCID(集成电路卡识别码)、硬件序列号、IDFA、Android ID、OAID、Google AID(Google广告ID)、蓝牙MAC;

    • 设备网络信息:IP地址(可选)、附近WIFI列表(可选)、BSSID(可选)、SSID(可选)、运营商信息、网络类型、网络状态、SIM卡状态、网卡信息;

    • 设备应用信息:SDK宿主APP信息(包括:应用名称、应用版本、安装时间)、应用列表(可选)。

  • 隐私政策链接:《风险识别SDK隐私权政策》

3、您务必确保用户同意《风险识别SDK隐私权政策》之后,再使用阿里云设备风险识别SDK采集信息。如无必要,请勿在启动应用时采集设备信息,避免过度或过早采集。

权限说明

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

权限

是否必选

备注

NSLocalNetworkUsageDescription

否(推荐赋予)

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

NSUserTrackingUsageDescription

用于获取IDFA信息,增强设备ID稳定性。

下载及配置SDK

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

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

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

AppTrackingTransparency.framework
CoreTelephony.framework
libresolv.tbd
Security.framework
AdSupport.framework
libz.tbd
libc++.tbd
deviceiOS.framework

iOS SDK

4、下载Objective-C Demo。(单击设备APP管理 > 下载设备SDK > 更多版本,安卓:A.demo,iOS:I.demo)。

5、请根据自身业务属性,选择是否带有idfa等敏感数据采集功能的SDK,具体参考SDK下载列表描述。

通过SDK采集数据

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

  • 函数原型

@interface SecurityDevice : NSObject
- (void)initDevice:(NSString *)userAppKey 
  	withOptions:(NSMutableDictionary *)options 
    callback:(void (^)(int))initCallback;
// ...
@end
  • 参数

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

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

字段名

说明

示例

IPv6

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

默认为“0”:使用IPv4域名;

“1”:使用IPv6域名。

"1"

CustomUrl

设置自有数据上报服务器域名

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

CustomHost

设置自有数据上报服务器host

"cloudauth-device.aliyuncs.com"

initCallback:设备风险SDK采集数据回调接口,可在回调中判断采集数据是否成功。其中,Code字段取值范围可参考“状态返回值”。

返回值:无。

说明

initCallback回调的Code值返回不为10000的时候,可以在App后续的逻辑中重新调用initDevice接口进行数据采集,直到成功为止。

获取客户端Token

获取客户端Token,并上报到业务服务器,后续通过服务器端设备风险识别事件及返回参数,从而获取设备风险信息。

  • 函数原型

@interface SecurityDevice : NSObject
// ...
- (SecurityToken *) getDeviceToken;
@end

参数:无。

返回值:SecurityToken类型。

  • Code:返回接口调用状态码,可用于判断接口调用是否成功。Code字段取值范围可参考“状态返回值”。

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

@interface SecurityToken : NSObject

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

 // token 字符串
@property(copy, atomic) NSString *token;

@end

Token获取时机建议:

1、在initDevice接口的callback返回10000的时候获取;

2、如果不等待initDevicecallback返回,我们建议initDevice接口和getDeviceToken接口口调用时间能间隔2秒以上;(因为数据上报可能存在延迟)

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

状态返回值

Code

说明

10000

SDK采集数据成功。

10001

SDK未采集数据。

10002

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

10003

系统未知错误。

10004

网络错误。

10005

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

10006

网络返回的格式非法。

10007

服务端配置解析失败。

10008

内部采集数据未完成。

示例代码

设备风险识别SDK采集数据,initDevice接口需要在各种风险场景中尽可能早的时候调用。

说明

根据苹果官方隐私政策规定,IDFA的使用除了在plist中做相关说明之后,需要调用方主动弹框提示用户授权,因此开发环境需要确保是Xcode 12以上。

typedef void (^IDFARequestBlock)(bool success);

API_AVAILABLE(ios(14))
static bool isATTrackingEnabled(ATTrackingManagerAuthorizationStatus status) {
    if (ATTrackingManagerAuthorizationStatusAuthorized == status) {
        return true;
    }
    return false;
}

- (void)helperRequestIDFAPermissionWithBlock:(IDFARequestBlock) complete {
    if (@available(iOS 14, *)) {
        ATTrackingManagerAuthorizationStatus authStatus = ATTrackingManager.trackingAuthorizationStatus;
        if (ATTrackingManagerAuthorizationStatusNotDetermined == authStatus) {
            [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
                if (nil != complete) {
                    return complete(isATTrackingEnabled(status));
                }
            }];
        } else if (nil != complete) {
            return complete(isATTrackingEnabled(authStatus));
        }
    }
}

- (void)initSecurityDevice {
    SecurityDevice *securityDevice = [SecurityDevice sharedInstance];
    [securityDevice initDevice: @ "ALIYUN_APPKEY": ^ (int code) {
        NSString * initResult = [NSString stringWithFormat: @ "init code: %d", code];
        NSLog(@ "%@", initResult);
        if (10000 != code) {
            NSLog(@ "init error.");
        } else {
            NSLog(@ "init success");
        }
    }];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // iOS 14及以上系统需要用户弹框获取 IDFA 权限。
    if (@available(iOS 14, *)) {
        [self helperRequestIDFAPermissionWithBlock:^(bool success) {
            if (success) {
                NSLog(@"IDFA Permission OK.");
            } else {
                NSLog(@"No IDFA Permission.");
            }
            
            [self initSecurityDevice];
        }];
    } else {
        [self initSecurityDevice];
    }
}

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

SecurityDevice *securityDevice = [SecurityDevice sharedInstance];
SecurityToken * deviceToken = [securityDevice getDeviceToken];
NSString * rs = [NSString stringWithFormat: @ "[%d]%@", deviceToken.code, deviceToken.token];
NSLog(@ "deviceToken: %@", rs);

// 发送token到业务自有服务器并查询阿里云设备风险识别接口。
// ...

调用风险识别API接口

deviceToken与其他参数,根据如下相应的风险识别服务事件参数文档说明,请求风险识别API接口进行识别:

注册风险识别功能及参数说明

营销风险识别-增强版事件及返回参数

登录风险识别功能及参数说明

设备风险识别事件及返回参数