RNLGeetestSensebot.m 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #if __has_include(<React/RCTConvert.h>)
  2. #import <React/RCTConvert.h>
  3. #else
  4. #import "RCTConvert.h"
  5. #endif
  6. #if __has_include(<React/RCTUtils.h>)
  7. #import <React/RCTUtils.h>
  8. #else
  9. #import "RCTUtils.h"
  10. #endif
  11. #import <GT3Captcha/GT3Captcha.h>
  12. #import "RNLGeetestSensebot.h"
  13. static NSString* EventName = @"RNLGeetestSensebotEvent";
  14. typedef NS_ENUM(NSUInteger, RNLGSEvent) {
  15. RNLGSResultEvent = 1,
  16. RNLGSClosedEvent = 2,
  17. RNLGSFailedEvent = 3,
  18. RNLGSErrorEvent = 0,
  19. };
  20. static NSNumber* RNLGSGetEventCode(RNLGSEvent event) {
  21. return [NSNumber numberWithUnsignedInteger:event];
  22. }
  23. typedef NS_ENUM(NSInteger, RNLGSError) {
  24. RNLGSParameterParseError = -1,
  25. };
  26. static NSNumber* RNLGSGetErrorCode(RNLGSError event) {
  27. return [NSNumber numberWithInteger:event];
  28. }
  29. @interface RNLGeetestSensebot () <GT3CaptchaManagerDelegate, GT3CaptchaManagerViewDelegate>
  30. @end
  31. @implementation RNLGeetestSensebot {
  32. GT3CaptchaManager *_manager;
  33. }
  34. RCT_EXPORT_METHOD(start:(NSDictionary *)option)
  35. {
  36. @try {
  37. // view load timeout
  38. NSTimeInterval timeout = [RCTConvert double:option[@"loadTimeout"]] / 1000.0;
  39. // init manager
  40. _manager = [[GT3CaptchaManager alloc] initWithAPI1:nil API2:nil timeout:timeout];
  41. _manager.delegate = self;
  42. _manager.viewDelegate = self;
  43. // debug
  44. BOOL enableDebugMode = [RCTConvert BOOL:option[@"debug"]];
  45. [_manager enableDebugMode: enableDebugMode];
  46. // request timeout
  47. NSTimeInterval gtViewTimeout = [RCTConvert double:option[@"reqTimeout"]] / 1000.0;
  48. [_manager useGTViewWithTimeout:gtViewTimeout];
  49. // lang
  50. GT3LanguageType lang = [RNLGeetestSensebot parseLanguag:
  51. [RCTConvert NSString:option[@"lang"]]];
  52. [_manager useLanguage:lang];
  53. // enable background cancel
  54. BOOL disableBackgroundUserInteraction = ![RCTConvert BOOL:option[@"enableBackgroundCancel"]];
  55. [_manager disableBackgroundUserInteraction:disableBackgroundUserInteraction];
  56. // background color
  57. UIColor *maskColor = [RCTConvert UIColor:option[@"backgroundColorIOS"]];
  58. if (maskColor != nil) {
  59. _manager.maskColor = maskColor;
  60. }
  61. // background blur effect
  62. NSInteger blurEffectStyle = [RCTConvert NSInteger:option[@"backgroundBlurEffectIOS"]];
  63. if (blurEffectStyle >= UIBlurEffectStyleExtraLight && blurEffectStyle <= UIBlurEffectStyleProminent) {
  64. // enum bound
  65. [_manager useVisualViewWithEffect:
  66. [UIBlurEffect effectWithStyle:(UIBlurEffectStyle)blurEffectStyle]];
  67. }
  68. // api1 json result
  69. NSDictionary *api1JSON = RCTJSONParse([RCTConvert NSString:option[@"api1Result"]], nil);
  70. [_manager configureGTest:[api1JSON objectForKey:@"gt"]
  71. challenge:[api1JSON objectForKey:@"challenge"]
  72. success:[api1JSON objectForKey:@"success"]
  73. withAPI2:nil];
  74. // registe and start validate
  75. [_manager registerCaptcha:nil];
  76. [_manager startGTCaptchaWithAnimated:YES];
  77. } @catch (NSException *e) {
  78. NSMutableString *errorMessage = [NSMutableString new];
  79. [errorMessage appendString:[e name]];
  80. if ([e reason] != nil) {
  81. [errorMessage appendFormat:@", %@", [e reason]];
  82. }
  83. if ([e userInfo] != nil) {
  84. [errorMessage appendFormat:@", %@", [e userInfo]];
  85. }
  86. [self sendEvent:@[
  87. RNLGSGetEventCode(RNLGSErrorEvent),
  88. RNLGSGetErrorCode(RNLGSParameterParseError),
  89. errorMessage]];
  90. }
  91. }
  92. RCT_EXPORT_METHOD(stop)
  93. {
  94. if (_manager != nil) {
  95. [_manager stopGTCaptcha];
  96. _manager = nil;
  97. }
  98. }
  99. +(GT3LanguageType)parseLanguag:(NSString *)lang
  100. {
  101. if ([lang isEqualToString:@"system"]) {
  102. return GT3LANGTYPE_AUTO;
  103. } else if ([lang isEqualToString:@"zh"]) {
  104. return GT3LANGTYPE_ZH_CN;
  105. } else if ([lang isEqualToString:@"zh-tw"]) {
  106. return GT3LANGTYPE_ZH_TW;
  107. } else if ([lang isEqualToString:@"zh-hk"]) {
  108. return GT3LANGTYPE_ZH_HK;
  109. } else if ([lang isEqualToString:@"en"]) {
  110. return GT3LANGTYPE_EN;
  111. } else if ([lang isEqualToString:@"id"]) {
  112. return GT3LANGTYPE_ID;
  113. } else if ([lang isEqualToString:@"ja"]) {
  114. return GT3LANGTYPE_JA_JP;
  115. } else if ([lang isEqualToString:@"ko"]) {
  116. return GT3LANGTYPE_KO_KR;
  117. } else if ([lang isEqualToString:@"ru"]) {
  118. return GT3LANGTYPE_RU;
  119. } else if ([lang isEqualToString:@"ar"]) {
  120. return GT3LANGTYPE_AR;
  121. } else if ([lang isEqualToString:@"es"]) {
  122. return GT3LANGTYPE_ES;
  123. } else if ([lang isEqualToString:@"pt-pt"]) {
  124. return GT3LANGTYPE_PT_PT;
  125. } else if ([lang isEqualToString:@"fr"]) {
  126. return GT3LANGTYPE_FR;
  127. } else if ([lang isEqualToString:@"de"]) {
  128. return GT3LANGTYPE_DE;
  129. }
  130. return GT3LANGTYPE_AUTO;
  131. }
  132. #pragma GT3 Delegate
  133. - (void)gtCaptcha:(GT3CaptchaManager *)manager errorHandler:(GT3Error *)error
  134. {
  135. NSMutableString *errorMessage = [NSMutableString new];
  136. [errorMessage appendString:[error error_code]];
  137. [errorMessage appendFormat:@", %@", [error gtDescription]];
  138. [self sendEvent:@[RNLGSGetEventCode(RNLGSFailedEvent),
  139. errorMessage]];
  140. }
  141. - (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveCaptchaCode:(NSString *)code result:(NSDictionary *)result message:(NSString *)message
  142. {
  143. if ([code isEqualToString:@"0"]) {
  144. [self sendEvent:@[RNLGSGetEventCode(RNLGSFailedEvent),
  145. RCTJSONStringify(result, nil)]];
  146. } else if ([code isEqualToString:@"1"]) {
  147. [self sendEvent:@[RNLGSGetEventCode(RNLGSResultEvent),
  148. RCTJSONStringify(result, nil)]];
  149. }
  150. }
  151. - (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveSecondaryCaptchaData:(NSData *)data response:(NSURLResponse *)response error:(GT3Error *)error decisionHandler:(void (^)(GT3SecondaryCaptchaPolicy))decisionHandler
  152. {
  153. }
  154. - (void)gtCaptchaUserDidCloseGTView:(GT3CaptchaManager *)manager
  155. {
  156. [self sendEvent:@[RNLGSGetEventCode(RNLGSClosedEvent)]];
  157. }
  158. - (BOOL)shouldUseDefaultRegisterAPI:(GT3CaptchaManager *)manager
  159. {
  160. return NO;
  161. }
  162. - (BOOL)shouldUseDefaultSecondaryValidate:(GT3CaptchaManager *)manager
  163. {
  164. return NO;
  165. }
  166. #pragma react native bridge
  167. - (NSArray<NSString *> *)supportedEvents
  168. {
  169. return @[EventName];
  170. }
  171. - (void)sendEvent:(id)body
  172. {
  173. [self sendEventWithName:EventName body:body];
  174. }
  175. RCT_EXPORT_MODULE()
  176. + (BOOL)requiresMainQueueSetup
  177. {
  178. return YES;
  179. }
  180. - (dispatch_queue_t)methodQueue
  181. {
  182. return dispatch_get_main_queue();
  183. }
  184. @end