本文介绍ADD_VERIFY_PRO的iOS端接入流程。
使用须知
iOS SDK使用限制如下:
不支持模拟器模式调试。
iOS系统版本为9.0及以上。
根据苹果官方隐私政策规定,使用 IDFA 除了在
plist中做相关说明外,需要调用方主动弹框提示用户授权,因此开发环境需要确保是 Xcode 12 以上。
接入步骤
依赖配置
下载 iOS SDK(请联系商务经理获取),SDK为XCode上标准静态framework包。
说明单架构的 SO 文件在 2M 左右。
DEVICE GUARD SDK 为了保证自身的抗逆向性以及数据在网络传输过程中的安全性,SDK 中有大量的插花、膨胀及加解密操作,所以 SDK 体积会相对较大。
将 SDK 包中的 faceguard.framework 复制到 iOS 工程目录下。
选择工程配置,定位到 Build Phases -> Link Binary With Libraries,添加 faceguard.framework 及其依赖包:
CoreTelephony.framework Security.framework libresolv.tbd libc++.tbd libz.tbd faceguard.framework
调用SDK
前期准备完成后,可按照下面三个步骤完成客户端接入。
根据苹果官方隐私政策规定,需要 IDFA 的使用除了在 plist 中做相关说明之后,需要调用方主动弹框提示用户授权,因此开发环境需要确保是 Xcode 12 以上。
1. 初始化(initFG)
SDK 内部初始化,在 App 启动的时候,您需要尽可能早地调用该函数。请参考接入流程,调用初始化 initFG 接口。
函数原型
@interface FaceGuardDevice : NSObject /** * DEVICE GUARD初始化函数 */ - (void)initFG:(NSString *)userProductKey withOptions:(NSMutableDictionary *)options callback:(void (^)(int))initCallback; // ... @end参数说明
userProductKey:用于标识用户身份,阿里云分配的产品 AppKey(不同于AK),请联系商务经理获取。
options:信息采集可选项,默认可以为 nil。可选参数如下:
说明常见国际站点不需要设置CustomUrl和CustomHost参数,默认使用新加坡站点。
指定站点上报,需要设置CustomUrl和CustomHost为指定地域。
字段名
说明
示例
IPv6
是否使用IPv6域名上报设备信息。
0(默认):使用IPv4域名
1:使用IPv6域名
"1"
DataSwitch
设备信息上报时机。
0(默认):初始化时
1:获取Token时
说明建议采用默认配置。
"1"
CustomUrl
设置数据上报服务器域名。
"https://cloudauth-device.ap-southeast-1.aliyuncs.com"
CustomHost
设置数据上报服务器host。
"cloudauth-device.ap-southeast-1.aliyuncs.com"
initCallback:初始化回调监听接口,可在回调中判断初始化是否成功, 默认可以为nil。其中,code 字段取值范围可参考code返回值。
调用示例
NSMutableDictionary *options = [[NSMutableDictionary alloc] init]; [options setValue:@"0" forKey:@"IPv6"]; // 设置IPv4 [options setValue:@"0" forKey:@"DataSwitch"]; // 设置为初始化阶段采集 // 设置自定义的数据上报地域 // [options setValue:@"xxx" forKey:@"CustomUrl"]; 设置上报站点Url // [options setValue:@"xxx" forKey:@"CustomHost"]; 设置上报站点Host // 标准调用(推荐) [[FaceGuardDevice sharedInstance] initFG:@"******" withOptions:options callback:nil]; // 回调调用 [[FaceGuardDevice sharedInstance] initFG:@"******" withOptions:options callback:^(int code) { NSString * initResult = [NSString stringWithFormat: @ "设备助手初始化,结果 %d", code]; NSLog(@ "%@", initResult); if (SC_SUCCESS != code) { NSLog(@ "初始化失败"); } else { NSLog(@ "初始化成功"); } }];
2. 获取客户端token(getDeviceToken)
获取客户端 token,请参考接入流程进行调用,并上报到业务自己的服务器,后续通过服务器端查询ADD_VERIFY_PRO的服务端API接口,从而验证设备地址。
请参考接入流程进行接入,确保 initFG 接口和 getDeviceToken 接口调用时间间隔 3 秒以上。
建议在 APP 子线程上调用 getDeviceToken 接口,以避免接口调用耗时可能导致的崩溃。
函数原型
@interface FaceGuardDevice : NSObject - (FaceGuardToken *) getDeviceToken; @end返回值
FaceGuardToken 类型,定义如下:
@interface FaceGuardToken: NSObject /** * 获取token操作的结果 */ @property(atomic) int code; /** * 包含token结果的字符串 */ @property(copy, atomic) NSString * token; @endcode:返回接口调用状态码,可用于判断接口调用是否成功。
token:返回 token 字符串信息,可用于业务后续查询阿里云ADD_VERIFY_PRO接口。
重要token 字符串在网络环境良好的场景下,长度为 600 字节左右;在网络环境较差的场景下,返回的长度在 2.5K 左右,并且带有特殊标识:
有网:"U0dfTkxxxx"
弱网:"U0dfUFxxxx"
如果业务上出现了大量的长 token:
首先,请确保客户端的网络是畅通的;
其次,请参考接入流程进行接入,确保 SDK 的 initFG 接口和 getDeviceToken 接口调用间隔在 3 秒以上。
调用示例
// 推荐传入bizId,防止deviceToken被篡改 NSString *bizId = @"1234567890abcdef******"; FaceGuardToken *deviceToken = [[FaceGuardDevice sharedInstance] getDeviceToken:bizId]; if (deviceToken == nil || SC_SUCCESS != deviceToken.code) { NSLog(@"获取token失败, 调用结果不可用于风险标签查询"); } else { NSLog(@"获取token成功, 后续可以正常查询风险标签. Token: %@", deviceToken.token); }
3. 携带Token请求服务端
成功获取deviceToken(FaceGuardDevice.token)后,可携带此参数请求业务服务器,由服务端查询并校验结果。具体操作,请参见服务端API接口。
完整代码示例
#import "ViewController.h"
#import <faceguard/faceguard.h>
@implementation ViewController
static NSString *USER_PRODUCT_KEY = @"<请联系商务经理获取>";
- (void)viewDidLoad {
[super viewDidLoad];
// 接入示例
[self doStantard];
}
- (void)doStandard {
// 初始化SDK
// 在App生命周期中只需要调用1次
// 建议在接入流程时机1调用initFG接口
[self doInit];
dispatch_async(dispatch_get_global_queue(NULL, NULL), ^{
// 建议在接入流程时机2调用getDeviceToken接口
// 此处等待2s仅模拟认证流程
// [NSThread sleepForTimeInterval:2.0];
// 获取Token
[self doGetToken];
});
}
- (void)doInit {
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setValue:@"0" forKey:@"IPv6"]; // 设置IPv4
[options setValue:@"0" forKey:@"DataSwitch"]; // 设置设备信息采集上报时机
// 设置自定义上报地域
// [options setValue:@"xxx" forKey:@"CustomUrl"];
// [options setValue:@"xxx" forKey:@"CustomHost"];
[[FaceGuardDevice sharedInstance] initFG:USER_PRODUCT_KEY withOptions:options callback:nil];
}
- (void)doGetToken {
FaceGuardToken *deviceToken = [[FaceGuardDevice sharedInstance] getDeviceToken];
if (deviceToken == nil || SC_SUCCESS != deviceToken.code) {
NSLog(@"获取token失败, 调用结果不可用于风险标签查询");
} else {
NSLog(@"获取token成功, 后续可以正常查询风险标签. Token: %@", deviceToken.token);
}
}
@end