GT3CaptchaManager.h 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. //
  2. // GTCaptchaManager.h
  3. // GTCaptcha
  4. //
  5. // Created by NikoXu on 8/22/16.
  6. // Copyright © 2016 Geetest. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. #import "GT3AsyncTaskProtocol.h"
  10. #import "GT3Utils.h"
  11. #import "GT3Error.h"
  12. @protocol GT3CaptchaManagerDelegate, GT3CaptchaNetworkDelegate, GT3CaptchaManagerViewDelegate, GT3CaptchaManagerStatisticDelegate;
  13. @interface GT3CaptchaManager : NSObject
  14. /** SDK版本号 */
  15. + (NSString *)sdkVersion;
  16. /** 验证管理代理 */
  17. @property (nonatomic, weak) id<GT3CaptchaManagerDelegate> delegate;
  18. /** 验证网络代理 */
  19. @property (nonatomic, weak) id<GT3CaptchaNetworkDelegate> networkDelegate;
  20. /** 验证视图代理 */
  21. @property (nonatomic, weak) id<GT3CaptchaManagerViewDelegate> viewDelegate;
  22. /** 验证统计代理 */
  23. @property (nonatomic, weak) id<GT3CaptchaManagerStatisticDelegate> statisticDelegate;
  24. /** 验证状态 */
  25. @property (nonatomic, readonly) GT3CaptchaState captchaState;
  26. /** 图形验证的展示状态 */
  27. @property (nonatomic, readonly) BOOL isShowing;
  28. /** 获取启动验证参数的接口 */
  29. @property (nonatomic, readonly) NSURL *API_1;
  30. /** 进行二次验证的接口 */
  31. @property (nonatomic, readonly) NSURL *API_2;
  32. /** 验证的ID */
  33. @property (nonatomic, readonly, strong) NSString *gt_captcha_id;
  34. /** 验证的会话标识 */
  35. @property (nonatomic, readonly, strong) NSString *gt_challenge;
  36. /** 验证的服务状态, 1正常/0宕机 */
  37. @property (nonatomic, readonly, strong) NSNumber *gt_success_code;
  38. /** 背景验证 */
  39. @property (nonatomic, strong) UIColor *maskColor;
  40. #pragma mark 基本方法
  41. /**
  42. * @abstract 验证初始化方法
  43. *
  44. * @discussion 请不要在接口api_1和api_2的URL上带动态参数, 如果需要对api_1和api_2的请求做修改见GT3CaptchaManagerDelegate代理方法`gtCaptcha:willSendRequestAPI1:withReplacedHandler:`及 `gtCaptcha:willSendSecondaryCaptchaRequest:withReplacedRequest:`
  45. *
  46. * @seealso `gtCaptcha:willSendRequestAPI1:withReplacedHandler:`及`gtCaptcha:willSendSecondaryCaptchaRequest:withReplacedRequest:`
  47. *
  48. * @param api_1 获取验证参数的接口
  49. * @param api_2 进行二次验证的接口
  50. * @param timeout 超时时长
  51. * @return GT3CaptchaManager 实例
  52. *
  53. */
  54. - (instancetype)initWithAPI1:(NSString *)api_1
  55. API2:(NSString *)api_2
  56. timeout:(NSTimeInterval)timeout NS_DESIGNATED_INITIALIZER;
  57. /**
  58. * @abstract 取消异步请求
  59. *
  60. * @discussion
  61. * 当希望取消正在执行的<b>NSURLSessionDataTask</b>时,调用此方法
  62. *
  63. * ❗️<b>内部请求基于NSURLSeesion</b>
  64. */
  65. - (void)cancelRequest;
  66. /**
  67. * @abstract 自定义配置验证参数
  68. *
  69. * @discussion
  70. * 从后端sdk获取的验证参数, 其中单个challenge只能使用在同一次验证会话中
  71. *
  72. * @param gt_id 在官网申请的captcha_id
  73. * @param gt_challenge 根据极验服务器sdk生成的challenge
  74. * @param gt_success_code 网站主服务器监测geetest服务的可用状态 0/1 不可用/可用
  75. * @param api_2 用于二次验证的接口.网站主根据极验服务端sdk来部署.
  76. *
  77. */
  78. - (void)configureGTest:(NSString *)gt_id
  79. challenge:(NSString *)gt_challenge
  80. success:(NSNumber *)gt_success_code
  81. withAPI2:(NSString *)api_2 API_DEPRECATED_WITH_REPLACEMENT("registerCaptchaWithCustomAsyncTask:completion:", ios(2.0, 6.0));
  82. /**
  83. *
  84. * @abstract 注册验证
  85. *
  86. * @param completionHandler 注册成功后的回调
  87. */
  88. - (void)registerCaptcha:(GT3CaptchaDefaultBlock)completionHandler;
  89. /**
  90. *
  91. * @abstract 注册验证,并且自定义 API1 及 API2 流程
  92. *
  93. * @param customAsyncTask 自定义 API1 及 API2 任务对象
  94. * @param completionHandler 注册成功后的回调
  95. *
  96. * @discussion
  97. * 因管理器内部以弱引用方式持有 customAsyncTask,需要开发者自己
  98. * 在调用类中保持,以保证管理器在后续流程中能正常访问到该对象。
  99. *
  100. * @seealso GT3AsyncTaskProtocol
  101. *
  102. */
  103. - (void)registerCaptchaWithCustomAsyncTask:(id<GT3AsyncTaskProtocol>)customAsyncTask completion:(GT3CaptchaDefaultBlock)completionHandler;
  104. /**
  105. * ❗️<b>必要方法</b>❗️
  106. * @abstract 开始验证
  107. *
  108. * @discussion
  109. * 获取姿态, 提交分析后, 如有必要在`[[UIApplication sharedApplication].delegate window]`上显示极验验证的GTView验证视图
  110. * 极验验证GTWebView通过JS与SDK通信
  111. * 内部逻辑会根据当前的`captchaState`属性的状态不同而变更
  112. *
  113. */
  114. - (void)startGTCaptchaWithAnimated:(BOOL)animated;
  115. /**
  116. * 终止验证
  117. */
  118. - (void)stopGTCaptcha;
  119. /**
  120. * @abstract 重置验证
  121. *
  122. * @discussion
  123. * 内部先调用`stopGTCaptcha`后, 在主线程延迟0.3秒后
  124. * 执行`startCaptcha`的内部方法。
  125. * 只在`GT3CaptchaStateFail`,`GT3CaptchaStateError`,
  126. * `GT3CaptchaStateSuccess`, `GT3CaptchaStateCancel`状态下执行。
  127. */
  128. - (void)resetGTCaptcha;
  129. /**
  130. * 若验证显示则关闭验证界面
  131. */
  132. - (void)closeGTViewIfIsOpen;
  133. /**
  134. * 获取cookie value
  135. *
  136. * @param cookieName cookie的键名
  137. * @return 对应的cookie的值
  138. */
  139. - (NSString *)getCookieValue:(NSString *)cookieName;
  140. #pragma mark 其他配置的方法
  141. /**
  142. * @abstract 图形验证超时的时长
  143. *
  144. * @param timeout GT3WebView资源请求超时时间
  145. */
  146. - (void)useGTViewWithTimeout:(NSTimeInterval)timeout;
  147. /**
  148. * @abstract 设置图形验证的圆角大小
  149. *
  150. * @param cornerRadius 圆角大小, 大小不超过 30 px
  151. */
  152. - (void)useGTViewWithCornerRadius:(CGFloat)cornerRadius;
  153. /**
  154. * @abstract 验证静态参数
  155. *
  156. * @discussion
  157. * 内部将参数转换成表单格式,并拼接到静态资源的请求上
  158. *
  159. * @param params 自定义参数
  160. */
  161. - (void)useGTViewWithParams:(NSDictionary *)params;
  162. /**
  163. * @abstract 验证标题
  164. *
  165. * @discussion
  166. * 默认不开启. 字符长度不能超过28, 一个中文字符为两个2字符长度.
  167. *
  168. * @param title 验证标题字符串
  169. */
  170. - (void)useGTViewWithTitle:(NSString *)title;
  171. /**
  172. * @abstract 配置状态指示器
  173. *
  174. * @discussion
  175. * 为了能方便的调试动画,真机调试模拟低速网络 Settings->Developer
  176. * ->Status->Enable->Edge(😂)
  177. *
  178. * @param animationBlock 自定义时需要实现的动画block,仅在type配置为GTIndicatorCustomType时才执行
  179. * @param type 状态指示器的类型
  180. */
  181. - (void)useAnimatedAcitvityIndicator:(GT3IndicatorAnimationViewBlock)animationBlock
  182. withIndicatorType:(GT3ActivityIndicatorType)type;
  183. /**
  184. * @abstract 配置背景模糊
  185. *
  186. * @discussion
  187. * iOS8以上生效
  188. *
  189. * @param blurEffect 模糊特效
  190. */
  191. - (void)useVisualViewWithEffect:(UIBlurEffect *)blurEffect;
  192. /**
  193. * @abstract 切换验证语言
  194. *
  195. * @discussion
  196. * 默认跟随系统语言。不支持的语言则显示为英文。
  197. *
  198. * @param type 语言类型
  199. */
  200. - (void)useLanguage:(GT3LanguageType)type;
  201. /**
  202. * @abstract 切换验证语言
  203. *
  204. * @discussion
  205. * 未设置或传 nil,默认跟随系统语言。不支持的语言则使用英文。
  206. *
  207. * @param lang 语言简码。请参考相关的语言简码列表。
  208. */
  209. - (void)useLanguageCode:(NSString *)lang;
  210. /**
  211. * @abstract 切换验证服务集群节点
  212. *
  213. * @discussion
  214. * 默认中国节点。使用其他节点需要使用相应的配置,否则无法正确访问验证服务。
  215. * 使用该方法前,请充分了解极验的服务集群节点。
  216. *
  217. * @param node 集群节点
  218. */
  219. - (void)useServiceNode:(GT3CaptchaServiceNode)node;
  220. /**
  221. * @abstract 完全使用HTTPS协议请求验证
  222. *
  223. * @discussion
  224. * 默认开启HTTPS
  225. *
  226. * @param disable 是否禁止https支持
  227. */
  228. - (void)disableSecurityAuthentication:(BOOL)disable;
  229. /**
  230. * @abstract 验证背景交互事件的开关
  231. *
  232. * @discussion 默认关闭
  233. *
  234. * @param disable YES忽略交互事件/NO接受交互事件
  235. */
  236. - (void)disableBackgroundUserInteraction:(BOOL)disable;
  237. /**
  238. * @abstract 控制验证管理器内部的网络可达性检测
  239. *
  240. * @param enable YES 开启/NO 关闭. 默认YES.
  241. */
  242. - (void)enableNetworkReachability:(BOOL)enable;
  243. /**
  244. * @abstract Debug Mode
  245. *
  246. * @discussion
  247. * 开启debugMode,在开启验证之前调用此方法
  248. * 默认不开启
  249. *
  250. * @param enable YES开启,NO关闭
  251. */
  252. - (void)enableDebugMode:(BOOL)enable;
  253. /**
  254. * @abstract 设置是否允许打印日志
  255. *
  256. * @param enabled YES,允许打印日志 NO,禁止打印日志
  257. */
  258. + (void)setLogEnabled:(BOOL)enabled;
  259. /**
  260. * @abstract 是否允许打印日志
  261. *
  262. * @return YES,允许打印日志 NO,禁止打印日志
  263. */
  264. + (BOOL)isLogEnabled;
  265. @end
  266. #pragma mark - 验证代理方法
  267. @protocol GT3CaptchaManagerDelegate <NSObject>
  268. @required
  269. /**
  270. * 验证错误处理
  271. *
  272. * @discussion 抛出内部错误, 比如GTWebView等错误
  273. *
  274. * @param manager 验证管理器
  275. * @param error 错误源
  276. */
  277. - (void)gtCaptcha:(GT3CaptchaManager *)manager errorHandler:(GT3Error *)error;
  278. /**
  279. * @abstract 通知已经收到二次验证结果, 在此处理最终验证结果
  280. *
  281. * @discussion
  282. * 二次验证的错误只在这里返回, `decisionHandler`需要处理
  283. *
  284. * @param manager 验证管理器
  285. * @param data 二次验证返回的数据
  286. * @param response 二次验证的响应
  287. * @param error 错误源
  288. * @param decisionHandler 更新验证结果的视图
  289. */
  290. - (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveSecondaryCaptchaData:(NSData *)data response:(NSURLResponse *)response error:(GT3Error *)error decisionHandler:(void (^)(GT3SecondaryCaptchaPolicy captchaPolicy))decisionHandler;
  291. @optional
  292. /**
  293. * @abstract 是否使用内部默认的API1请求逻辑
  294. *
  295. * @param manager 验证管理器
  296. * @return YES使用,NO不使用
  297. */
  298. - (BOOL)shouldUseDefaultRegisterAPI:(GT3CaptchaManager *)manager;
  299. /**
  300. * @abstract 将要向<b>API1</b>发送请求的时候调用此方法, 通过此方法可以修改将要发送的请求
  301. *
  302. * @warning 不支持子线程操作。
  303. *
  304. * @discussion 调用此方法的时候必须执行<b>requestHandler</b>, 否则可能导致内存泄露。
  305. *
  306. * @param manager 验证管理器
  307. * @param originalRequest 默认发送的请求对象
  308. * @param replacedHandler 修改请求的执行block
  309. */
  310. - (void)gtCaptcha:(GT3CaptchaManager *)manager willSendRequestAPI1:(NSURLRequest *)originalRequest withReplacedHandler:(void (^)(NSURLRequest * request))replacedHandler;
  311. /**
  312. * @abstract 当接收到从<b>API1</b>的数据, 通知返回字典, 包括<b>gt_public_key</b>,
  313. * <b>gt_challenge</b>, <b>gt_success_code</b>
  314. *
  315. * @warning 不支持子线程操作。
  316. *
  317. * @discussion
  318. * 如果实现此方法, 需要解析验证需要的数据并返回。
  319. 如果不返回验证初始化数据, 使用内部的解析规则进行解析。默认先解析一级结构, 再匹配键名为"data"或"gtcap"中的数据。
  320. *
  321. * @param manager 验证管理器
  322. * @param dictionary API1返回的数据(未解析)
  323. * @param error 返回的错误
  324. *
  325. * @return 验证初始化数据, 格式见下方
  326. <pre>
  327. {
  328. "challenge" : "12ae1159ffdfcbbc306897e8d9bf6d06",
  329. "gt" : "ad872a4e1a51888967bdb7cb45589605",
  330. "success" : 1
  331. }
  332. </pre>
  333. */
  334. - (NSDictionary *)gtCaptcha:(GT3CaptchaManager *)manager didReceiveDataFromAPI1:(NSDictionary *)dictionary withError:(GT3Error *)error;
  335. /**
  336. * @abstract 通知接收到返回的验证交互结果
  337. *
  338. * @discussion 此方法仅仅是前端返回的初步结果, 并非验证最终结果。
  339. *
  340. * @param manager 验证管理器
  341. * @param code 验证交互结果, 0失败/1成功
  342. * @param result 二次验证数据
  343. * @param message 附带消息
  344. */
  345. - (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveCaptchaCode:(NSString *)code result:(NSDictionary *)result message:(NSString *)message;
  346. /**
  347. * @abstract 是否使用内部默认的API2请求逻辑
  348. *
  349. * @discussion 默认返回YES;
  350. *
  351. * @param manager 验证管理器
  352. * @return YES使用,NO不使用
  353. */
  354. - (BOOL)shouldUseDefaultSecondaryValidate:(GT3CaptchaManager *)manager;
  355. /**
  356. * @abstract 通知即将进行二次验证, 再次修改发送至<b>API2</b>的验证。
  357. *
  358. * @warning 不支持子线程操作。
  359. *
  360. * @discussion
  361. * 请不要修改<b>requestHandler</b>执行所在的线程或队列, 否则可能导
  362. * 请求修改失败. 二次验证的请求方式应为<b>POST</b>, 头部信息应为:
  363. * <pre>{"Content-Type":@"application/x-www-form-urlencoded;charset=UTF-8"}</pre>
  364. *
  365. * @param manager 验证管理器
  366. * @param replacedRequest 修改二次验证请求的block
  367. */
  368. - (void)gtCaptcha:(GT3CaptchaManager *)manager willSendSecondaryCaptchaRequest:(NSURLRequest *)originalRequest withReplacedRequest:(void (^)(NSMutableURLRequest * request))replacedRequest;
  369. /**
  370. * @abstract 用户主动关闭了验证码界面
  371. *
  372. * @param manager 验证管理器
  373. */
  374. - (void)gtCaptchaUserDidCloseGTView:(GT3CaptchaManager *)manager;
  375. @end
  376. @protocol GT3CaptchaNetworkDelegate <NSObject>
  377. - (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
  378. completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * credential))completionHandler;
  379. @end
  380. @protocol GT3CaptchaManagerViewDelegate <NSObject>
  381. @optional
  382. /**
  383. * @abstract 通知验证模式
  384. *
  385. * @param manager 验证管理器
  386. * @param mode 验证模式
  387. */
  388. - (void)gtCaptcha:(GT3CaptchaManager *)manager notifyCaptchaMode:(GT3CaptchaMode)mode;
  389. /**
  390. * @abstract 通知将要显示图形验证
  391. *
  392. * @param manager 验证管理器
  393. */
  394. - (void)gtCaptchaWillShowGTView:(GT3CaptchaManager *)manager;
  395. /**
  396. * @abstract 更新验证状态
  397. *
  398. * @param manager 验证管理器
  399. * @param state 验证状态
  400. * @param error 错误信息
  401. */
  402. - (void)gtCaptcha:(GT3CaptchaManager *)manager updateCaptchaStatus:(GT3CaptchaState)state error:(GT3Error *)error;
  403. /**
  404. * @abstract 更新验证视图
  405. *
  406. * @param manager 验证管理器
  407. * @param fromValue 起始值
  408. * @param toValue 终止值
  409. * @param timeInterval 时间间隔
  410. */
  411. - (void)gtCaptcha:(GT3CaptchaManager *)manager updateCaptchaViewWithFactor:(CGFloat)fromValue to:(CGFloat)toValue timeInterval:(NSTimeInterval)timeInterval;
  412. @end
  413. @protocol GT3CaptchaManagerStatisticDelegate <NSObject>
  414. @optional
  415. - (void)gtCaptchaDidStartCaptcha:(GT3CaptchaManager *)manager;
  416. - (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveFullpageResult:(NSString *)result;
  417. - (void)gtCaptchaNotifyGTViewDidReady:(GT3CaptchaManager *)manager;
  418. - (void)gtCaptcha:(GT3CaptchaManager *)manager didReturnStatisticInfomation:(NSData *)data;
  419. @end