部署文档
iOS 集成
iOS 原生应用集成指南
环境要求
| 项目 | 要求 |
|---|---|
| 开发目标 | iOS 9.0+ |
| 开发环境 | Xcode 13.0+ |
| 系统依赖 | Webkit.framework |
| 第三方依赖 | 无 |
SDK 已提供 XCFramework 格式,支持真机和模拟器。
安装
导入 XCFramework
将下载获取的 GeeLabCaptcha.xcframework 文件拖拽到工程中,确保 Copy items if needed 已被勾选。
使用 Linked Frameworks and Libraries 方式导入 framework。在拖入后,检查 .framework 文件是否被添加到 PROJECT -> Build Phases -> Linked Frameworks and Libraries。
配置 Linker Flags
针对静态库中的 Category,需要在对应 target 的 Build Settings -> Other Linker Flags 添加 -ObjC。
导入资源包
将 SDK 路径下的 GeeLabCaptcha.Bundle 拖入项目中。
重要: 必须导入 GeeLabCaptcha.Bundle,否则验证码无法正常工作。
隐私清单说明
从 2024 年春季开始,苹果要求所有应用和 SDK 提供隐私清单。
行为验证 iOS SDK 使用了以下 API 类别用于风控目的:
NSPrivacyAccessedAPICategoryDiskSpace- 获取硬盘容量信息NSPrivacyAccessedAPICategoryFileTimestamp- 环境检测信息
参考文档:
- Get started with privacy manifests - WWDC23
- Describing use of required reason API
- Privacy manifest files
基础集成
导入头文件
#import <GeeLabCaptcha/GeeLabCaptcha.h>初始化验证会话
#define captchaID @"YOUR_CAPTCHA_ID"
@interface ViewController () <GeeLabCaptchaSessionTaskDelegate>
@property (strong, nonatomic) IBOutlet UIButton *startBtn;
@property (nonatomic, strong) GeeLabCaptchaSession *captchaSession;
@end
@implementation ViewController
- (GeeLabCaptchaSession *)captchaSession {
if (!_captchaSession) {
_captchaSession = [GeeLabCaptchaSession sessionWithCaptchaID:captchaID];
_captchaSession.delegate = self;
}
return _captchaSession;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 提前初始化验证会话(推荐)
[self captchaSession];
[self.startBtn addTarget:self
action:@selector(start)
forControlEvents:UIControlEventTouchUpInside];
}
- (void)start {
[self.captchaSession verify];
}
@end提前初始化验证会话可以提升用户体验,减少等待时间。
导入框架
import GeeLabCaptcha初始化验证会话
class ViewController: UIViewController {
private let captchaID = "YOUR_CAPTCHA_ID"
private var captchaSession: GeeLabCaptchaSession?
override func viewDidLoad() {
super.viewDidLoad()
// 初始化验证会话
captchaSession = GeeLabCaptchaSession(captchaID: captchaID)
captchaSession?.delegate = self
}
@IBAction func startVerification(_ sender: UIButton) {
captchaSession?.verify()
}
}
extension ViewController: GeeLabCaptchaSessionTaskDelegate {
// 实现代理方法
}更多 Swift 示例代码请参考官方 Demo 中的 DefaultDemoViewController.swift 文件。
配置选项
自定义配置
通过 GeeLabCaptchaSessionConfiguration 自定义验证行为:
GeeLabCaptchaSessionConfiguration *config = [GeeLabCaptchaSessionConfiguration defaultConfiguration];
// 设置超时时间(秒)
config.timeout = 8.0f;
// 设置语言
config.language = @"zh-cn";
// 设置额外参数
config.additionalParameter = @{
@"hideSuccess": @(1), // 隐藏成功提示
@"loading": @"" // 自定义 loading
};
// 使用自定义配置创建会话
_captchaSession = [GeeLabCaptchaSession sessionWithCaptchaID:captchaID
configuration:config];配置参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
timeout | NSTimeInterval | 超时时间(秒) |
language | NSString | 语言代码(如 zh-cn, en) |
additionalParameter | NSDictionary | 额外参数 |
resourcePath | NSString | 自定义资源路径 |
处理验证结果
实现 GeeLabCaptchaSessionTaskDelegate 协议处理验证结果:
- (void)geelabCaptchaSession:(GeeLabCaptchaSession *)captchaSession
didReceive:(NSString *)code
result:(NSDictionary *)result {
NSLog(@"result: %@", result);
// code 为 @"1" 表示用户完成验证
if ([@"1" isEqualToString:code]) {
if (result && result.count > 0) {
// 构造表单数据
__block NSMutableArray<NSString *> *kvPairs = [NSMutableArray array];
[result enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([key isKindOfClass:[NSString class]] &&
[obj isKindOfClass:[NSString class]]) {
NSString *kvPair = [NSString stringWithFormat:@"%@=%@", key, obj];
[kvPairs addObject:kvPair];
}
}];
NSString *formStr = [kvPairs componentsJoinedByString:@"&"];
NSData *data = [formStr dataUsingEncoding:NSUTF8StringEncoding];
// 提交到后端验证
NSURL *url = [NSURL URLWithString:@"https://your-api.com/validate"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = data;
[[[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error && data) {
NSString *msg = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"验证结果: %@", msg);
} else {
NSLog(@"验证错误: %@", error);
}
}] resume];
}
}
}重要: 必须在服务端进行二次验证,不要仅依赖客户端结果。
- (void)geelabCaptchaSession:(GeeLabCaptchaSession *)captchaSession
didReceiveError:(GeeLabCaptchaError *)error {
// 向用户展示错误信息和错误码
NSString *message = [NSString stringWithFormat:@"验证错误 [%@]: %@",
error.code, error.description];
UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"验证失败"
message:message
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定"
style:UIAlertActionStyleDefault
handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
// 记录错误日志
NSLog(@"验证错误详情: %@", error.description);
}强烈建议在向用户展示验证错误时,同时展示错误码,方便后续排查线上问题。