Podfile 中添加以下内容:pod 'ClientAttestation', :podspec => './SDK' // 配置示例,请替换为实际SDK podspec地址
pod install
AppDelegate 或应用启动时执行一次。#import <TCBasCommon/TCBasCommon.h>#import <ClientAttestation/ClientAttestation.h>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// SDK初始化TCBasConfig *basConfig = [[TCBasConfig alloc] init];basConfig.baseUrl = @"www.example.com"; // 设置为业务域名basConfig.logLevel = TCBCLogLevelTypeWARN; // 可选,设置日志级别[TCBas initializeWithOptions:basConfig];return YES;}
baseUrl: 您的 EdgeOne 服务域名,例如 www.example.com。logLevel: 可选参数,用于控制 SDK 的日志输出级别。可选值包括:TCBCLogLevelTypeNONE: 关闭日志(默认)TCBCLogLevelTypeVERBOSE: 打开 verbose 以上级别日志TCBCLogLevelTypeDEBUG: 打开 debug 以上级别日志TCBCLogLevelTypeINFO: 打开 info 以上级别日志TCBCLogLevelTypeWARN: 打开 warning 以上级别日志TCBCLogLevelTypeERROR: 打开 error 以上级别日志extraDataProvider: 可选参数,设置IDFV,提升风险识别能力。#import <ClientAttestation/ClientAttestation.h>// 启动客户端认证引擎[[ClientAttestation sharedInstance] start];
WKWebView 中显示验证码)并计算认证令牌。这是通过 SDK 提供的 attestWithParams() 方法完成的。#import <ClientAttestation/ClientAttestation.h>// attestId// 主动发起挑战时从控制台获取// 被动发起挑战时从http返回的header字段中的‘EO-Attest-Challenge’获取NSString *attestId = @"your-attestId";AttestParams *params = [[AttestParams alloc] init];params.attestId = attestId;params.webView = self.webView; // 验证码界面显示使用的WebViewparams.reqTimeoutMillis = 60000; // 可选,请求超时时间[[ClientAttestation sharedInstance] attestWithParams:paramscallback:self];// 实现 AttestCallbackDelegate 协议#pragma mark - AttestCallbackDelegate- (void)onSuccess:(NSString *)token {// 返回风险票据,把票据放在http请求中的header字段‘EO-Attest-Token’}- (void)onError:(NSError *)error {// 错误信息回调}
attestId: 配置挑战 ID,从控制台获取或请求结果返回。webView: 可选参数,一个 WKWebView 实例。当认证器需要用户交互(如验证码)时,必须提供此参数。如果不需要 UI 交互,WKWebView 可以是隐藏的。vCodeDispType: 可选参数,交互式验证码UI的显示模式。弹出全屏框显示时使用VCodeDispTypePopup,在页面内嵌显示使用VCodeDispTypeFull,默认值:VCodeDispTypePopup。reqTimeoutMillis: 可选参数,设置请求超时时间,单位:毫秒,默认 60000 毫秒。getAttestationToken() 方法随时获取当前有效的认证令牌。attestWithParams() 成功后,SDK 都会生成或更新认证令牌。在将令牌附加到请求头之前,务必再次调用 getAttestationToken() 获取最新的令牌,每次需要使用令牌数据时,请重新获取新的令牌数据。请勿保存或重复使用 getAttestationToken() 返回的令牌数据。#import <ClientAttestation/ClientAttestation.h>// 获取客户端认证票据[[ClientAttestation sharedInstance] getAttestationTokenWithCompletion:^(NSString *token) {// 示例:将令牌添加到您的网络请求头中// 假设您正在使用 URLSession 或其他网络库if (token) {// 您的请求对象NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://your-backend-api.com/data"]];[request setValue:token forHTTPHeaderField:@"EO-Attest-Token"];// 继续发送请求}}];
#import <ClientAttestation/ClientAttestation.h>// 假设您的网络请求处理逻辑- (void)sendAPIRequest:(NSMutableURLRequest *)request {NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error) {NSLog(@"网络请求错误: %@", error.localizedDescription);return;}NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;if (httpResponse.statusCode == 428) {// 收到 428 挑战,提取挑战 IDNSString *challengeId = httpResponse.allHeaderFields[@"EO-Attest-Challenge"];if (challengeId) {NSLog(@"收到 428 挑战,挑战 ID: %@", challengeId);// 执行认证挑战AttestParams *attestParams = [[AttestParams alloc] init];attestParams.attestId = challengeId;attestParams.webView = self.webView;[[ClientAttestation sharedInstance] attestWithParams:attestParams callback:self];// 注意:这里需要处理 AttestCallbackDelegate 的回调,在 onSuccess 中重新发送请求} else {NSLog(@"428 响应中未找到 EO-Attest-Challenge 头");}} else if (httpResponse.statusCode == 200) {NSLog(@"请求成功!");// 处理业务数据} else {NSLog(@"请求失败,状态码: %ld", (long)httpResponse.statusCode);// 处理其他错误}}];[task resume];}// 示例调用// NSMutableURLRequest *initialRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://your-backend-api.com/protected-data"]];// [self sendAPIRequest:initialRequest];// 在 AttestCallbackDelegate 的 onSuccess 方法中重新发送请求#pragma mark - AttestCallbackDelegate- (void)onSuccess:(NSString *)token {NSLog(@"挑战成功,获取到新令牌: %@", token);// 重新发送原始请求,带上新令牌// 这里需要获取到之前的请求对象,并重新发送// 例如:// NSMutableURLRequest *retryRequest = [self.lastFailedRequest mutableCopy]; // 假设您保存了上次失败的请求// [retryRequest setValue:token forHTTPHeaderField:@"EO-Attest-Token"];// [self sendAPIRequest:retryRequest];}- (void)onError:(NSError *)error {NSLog(@"认证挑战失败: %@", error.localizedDescription);}
WKWebView 进行交互式认证(和 JS 认证)WKWebView (iOS 平台)是实现这些功能的关键组件。attestWithParams() 方法时提供一个 WKWebView 实例。这意味着开发者需在应用中预先分配 WKWebView 实例,并在调用认证 API 时将其作为参数传递给 SDK。WKWebView 实例来渲染其交互界面。该 WKWebView 实例将在应用内部显示验证码页面,因此需要预先设置以确保正确显示。WKWebView 实例作为 JavaScript 运行时环境,主要用于执行加密工作量证明 (PoW) 挑战。在此场景下,WKWebView 实例仅提供 JavaScript 执行沙箱,无需可见地渲染任何 UI。因此,传入的 WKWebView 实例无需可见,SDK 也不会将其用于 UI 渲染。피드백