JYNewMineViewController.m 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670
  1. //
  2. // JYNewSearchViewController.m
  3. // JianYuIOS
  4. //
  5. // Created by apple on 2020/6/5.
  6. // Copyright © 2020 lixianglan. All rights reserved.
  7. //
  8. #import "JYNewMineViewController.h"
  9. #import <WebKit/WebKit.h>
  10. #import "JYTabBarController.h"
  11. #import <CoreLocation/CoreLocation.h>
  12. /*
  13. afterPageInit 报异常
  14. afterClickBack 侧滑返回 首页-
  15. 分享回调报异常
  16. 不能支付
  17. */
  18. @interface JYNewMineViewController ()<WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler,CLLocationManagerDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate,SKProductsRequestDelegate,WBFaceVerifyCustomerServiceDelegate,ZKClipboardViewDelegate>
  19. {
  20. CGPoint startTouch;
  21. BOOL _isMoving;
  22. BOOL isExistNoNewWork;
  23. }
  24. @property (nonatomic, strong) UIProgressView *progressView;
  25. @property (nonatomic, strong) WKWebView *webView;
  26. @property(nonatomic, strong)NoNetView *noNetView;
  27. @property(nonatomic, strong)NoNetView *failNetView;
  28. @property(nonatomic, strong)UIPanGestureRecognizer *recognizer;
  29. @property(nonatomic, strong)ZKClipboardView *clipboardView;
  30. @property(nonatomic, strong)ZKFaceVerifyMsgView *verifyMsgView;
  31. //进度条是否加载中
  32. @property(nonatomic, assign)BOOL isRuningLoad;
  33. @end
  34. NSString *const new_kInitVector_4 = @"1389461544135476";
  35. size_t const new_kKeySize_4 = kCCKeySizeAES128;
  36. NSString *const new_AesKey_4 = @"mGlAgnIBB8bx2nch";
  37. @implementation JYNewMineViewController
  38. -(void)viewWillAppear:(BOOL)animated
  39. {
  40. [super viewWillAppear:animated];
  41. [self.navigationController setNavigationBarHidden:YES animated:animated];
  42. if ([GlobalData shareInstance].isClickNotiStatus) {
  43. [GlobalData shareInstance].mineIsRed = NO;
  44. [GlobalData shareInstance].isClickNotiStatus = NO;
  45. }else {
  46. if([GlobalData shareInstance].mineIsRed) {
  47. [GlobalData shareInstance].mineIsRed = NO;
  48. [self webViewFirstRequest];
  49. }
  50. }
  51. }
  52. //弹框
  53. -(ZKFaceVerifyMsgView *)verifyMsgView
  54. {
  55. if(!_verifyMsgView) {
  56. _verifyMsgView = [[ZKFaceVerifyMsgView alloc]initWithFrame:CGRectMake(0, 0, WIDTH*0.8, 150)];
  57. _verifyMsgView.titleName = @"温馨提示";
  58. }
  59. return _verifyMsgView;
  60. }
  61. //进度条
  62. - (UIProgressView *)progressView
  63. {
  64. if (_progressView == nil) {
  65. _progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0,STATUS_BAR_HEIGHT - 2,WIDTH,2)];
  66. _progressView.tintColor = [UIColor blueColor];
  67. _progressView.trackTintColor = [UIColor whiteColor];
  68. }
  69. return _progressView;
  70. }
  71. //弹框
  72. -(ZKClipboardView *)clipboardView{
  73. if(!_clipboardView) {
  74. _clipboardView = [[ZKClipboardView alloc]initWithFrame:CGRectMake(0, 0, WIDTH*0.8, 180+90)];
  75. _clipboardView.delegate = self;
  76. }
  77. return _clipboardView;
  78. }
  79. //懒加载
  80. - (WKWebView *)webView
  81. {
  82. if(_webView == nil) {
  83. WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
  84. config.preferences = [[WKPreferences alloc] init];
  85. config.preferences.minimumFontSize = 0;
  86. config.allowsInlineMediaPlayback = YES;
  87. config.preferences.javaScriptEnabled = YES;
  88. config.preferences.javaScriptCanOpenWindowsAutomatically = YES;
  89. //添加消息处理,注意:self指代的是需要遵守WKScriptMessageHandler协议,结束时需要移除
  90. config.userContentController = [[WKUserContentController alloc] init];
  91. //声明协议
  92. NSArray *jsArr = @[@"loginByWeixin",
  93. @"share",
  94. @"saveUserToken",
  95. @"removeUserToken",
  96. @"openSystemNotification",
  97. @"openExternalLink",
  98. @"alert",
  99. @"hiddenBottom",
  100. @"checkLab",
  101. @"loginSuccess",
  102. @"backUrl",
  103. @"clearPushMessage",
  104. @"hideRedSpotOnMenu",
  105. @"showRedSpotOnMenu",
  106. @"wxPay",
  107. @"aliPay",
  108. @"skipCameraWithParam",
  109. @"skipAlbumWithParam",
  110. @"openActivityPage",
  111. @"callPhone",
  112. @"openOtherAppLinks",
  113. @"inPurchasingVip",
  114. @"wirteRight",
  115. @"clearRight",
  116. @"savePic",
  117. @"ocrVerifyService",
  118. @"faceVerifyService",
  119. @"skipAppointTab",
  120. @"refreshAppointTab",
  121. ];
  122. for (NSString*jsName in jsArr) {
  123. [config.userContentController addScriptMessageHandler:self name:jsName];
  124. }
  125. //高端的自定义配置创建WKWebView
  126. if (iPhoneX) {
  127. _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT-TAB_BAR_HEIGHT) configuration:config];
  128. if (@available(iOS 11.0, *)) {
  129. _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  130. }
  131. }else {
  132. _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT-TAB_BAR_HEIGHT+STATUS_BAR_HEIGHT) configuration:config];
  133. }
  134. _webView.scrollView.bounces = NO;
  135. _webView.UIDelegate = self;
  136. _webView.navigationDelegate = self;
  137. // _webView.allowsBackForwardNavigationGestures = true;
  138. _webView.userInteractionEnabled = YES;
  139. [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
  140. }
  141. return _webView;
  142. }
  143. -(void)webViewFirstRequest
  144. {
  145. NSString *url = [NSString stringWithFormat:@"%@%@", kHost, @"jyapp/free/me"];
  146. url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  147. NSLog(@"444 :第一次加载:%@",url);
  148. kMainQueue(^{
  149. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
  150. })
  151. }
  152. #pragma mark - event response
  153. // 计算wkWebView进度条
  154. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  155. if (!self.isRuningLoad) {
  156. self.isRuningLoad = YES;
  157. }
  158. if (object == self.webView && [keyPath isEqualToString:@"estimatedProgress"]) {
  159. CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
  160. self.progressView.alpha = 1.0f;
  161. [self.progressView setProgress:newprogress animated:YES];
  162. if (newprogress >= 1.0f) {
  163. NSLog(@"进度条加载完毕...");
  164. self.isRuningLoad = NO;
  165. self.recognizer.enabled = YES;
  166. [UIView animateWithDuration:0.3f
  167. delay:0.3f
  168. options:UIViewAnimationOptionCurveEaseOut
  169. animations:^{
  170. self.progressView.alpha = 0.0f;
  171. }
  172. completion:^(BOOL finished) {
  173. [self.progressView setProgress:0 animated:NO];
  174. }];
  175. }
  176. } else {
  177. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  178. }
  179. }
  180. -(void)initNotification {
  181. //加载通知
  182. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(openPushUrlOtherMethods:) name:OpenPushUrlOtherMethods object:nil];
  183. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(openPushLinkUrlMethods:) name:OpenPushLinkUrlMethods object:nil];
  184. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(openPushUrlMethodsFour:) name:OpenPushUrlMethodsFour object:nil];
  185. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jyReceiveNewsRedPoint:) name:JYReceiveNewsRedPoint object:nil];
  186. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jyRefreshMenusView:) name:JYRefreshMenusView object:nil];
  187. //支付状态通知
  188. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(alipayWXpayStatus:) name:AlipayWXpayStatus object:nil];
  189. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notNetReloadWebVIew:) name:NotNetReloadWebVIew object:nil];
  190. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popWebView:) name:PopWebView object:nil];
  191. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginOut:) name:kLoginOut object:nil];
  192. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
  193. //接收全新通知
  194. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshNonCurVC:) name:RefreshNonCurVC object:nil];
  195. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshAllVC:) name:RefreshAllVC object:nil];
  196. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshExpAndMine:) name:RefreshExpAndMine object:nil];
  197. //监听购买结果
  198. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiptData:) name:@"receiptData" object:nil];
  199. //粘贴板-
  200. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateClipboard:) name:UpdateClipboard object:nil];
  201. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(openTheClipboard:) name:OpenTheClipboard object:nil];
  202. }
  203. #pragma mark – Gesture Recognizer –
  204. -(void)paningGestureReceive:(UIPanGestureRecognizer *)recoginzer
  205. {
  206. NSString *current_url = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
  207. CGRect rect = self.view.bounds;
  208. CGFloat width = CGRectGetWidth(rect);
  209. if (![self.webView canGoBack]||[current_url containsString:@"jyapp/free/login"]) {
  210. NSLog(@"不可返回");
  211. return;
  212. }
  213. if([current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/free/me",kHost]]||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/jylab/index",kHost]]||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/swordfish/historypush",kHost]]||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/jylab/mainSearch",kHost]]){
  214. return;
  215. }
  216. CGPoint touchPoint = [recoginzer locationInView:[UIApplication sharedApplication].keyWindow];
  217. if (recoginzer.state==UIGestureRecognizerStateBegan) {
  218. _isMoving = YES;
  219. startTouch = touchPoint;
  220. } else if (recoginzer.state==UIGestureRecognizerStateEnded||(recoginzer.state==UIGestureRecognizerStatePossible)){
  221. if (touchPoint.x - startTouch.x > width*0.125) {
  222. [UIView animateWithDuration:0.3 animations:^{
  223. if (recoginzer.state==UIGestureRecognizerStateEnded) {
  224. [self moveViewWithX:width];
  225. [self.webView goBack];
  226. }
  227. } completion:^(BOOL finished) {
  228. _isMoving = NO;
  229. [self moveViewWithX:0];
  230. }];
  231. } else {
  232. [UIView animateWithDuration:0.3 animations:^{
  233. [self moveViewWithX:0];
  234. } completion:^(BOOL finished) {
  235. _isMoving = NO;
  236. }];
  237. }
  238. return;
  239. } else if (recoginzer.state==UIGestureRecognizerStateCancelled){
  240. [UIView animateWithDuration:0.3 animations:^{
  241. [self moveViewWithX:0];
  242. } completion:^(BOOL finished) {
  243. _isMoving = NO;
  244. }];
  245. return;
  246. }else {
  247. }
  248. if (_isMoving) {
  249. [self moveViewWithX:touchPoint.x - startTouch.x];
  250. }
  251. }
  252. -(void)moveViewWithX:(float)x
  253. {
  254. CGRect rect = self.view.bounds;
  255. CGFloat width = CGRectGetWidth(rect);
  256. x = x>width?width:x;
  257. x = x<0?0:x;
  258. CGRect frame = self.webView.frame;
  259. frame.origin.x = x;
  260. self.webView.frame = frame;
  261. }
  262. - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
  263. // message.body -- Allowed types are NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull.
  264. // NSLog(@"原生收到了js发送过来的消息message.name = %@ message.body = %@",message.name,message.body);
  265. if ([message.name isEqualToString:@"loginByWeixin"]) {
  266. [self jsLoginByWeixin:message.body];
  267. }else if ([message.name isEqualToString:@"share"]) {
  268. [self jsShare:message.body];
  269. }else if ([message.name isEqualToString:@"saveUserToken"]) {
  270. [self jsSaveUserToken:message.body];
  271. }else if ([message.name isEqualToString:@"removeUserToken"]) {
  272. [self jsRemoveUserToken:message.body];
  273. }else if ([message.name isEqualToString:@"openSystemNotification"]) {
  274. [self jsOpenSystemNotification:message.body];
  275. }else if ([message.name isEqualToString:@"openExternalLink"]) {
  276. [self JsOpenExternalLink:message.body];
  277. }else if ([message.name isEqualToString:@"alert"]) {
  278. [self jsAlert:message.body];
  279. }else if ([message.name isEqualToString:@"hiddenBottom"]) {
  280. [self jsHiddenBottom:message.body];
  281. }else if ([message.name isEqualToString:@"checkLab"]) {
  282. [self jsCheckLab:message.body];
  283. }else if ([message.name isEqualToString:@"loginSuccess"]) {
  284. [self jsLoginSuccess:message.body];
  285. }else if ([message.name isEqualToString:@"backUrl"]) {
  286. [self jsBackUrl:message.body];
  287. }else if ([message.name isEqualToString:@"clearPushMessage"]) {
  288. [self jsClearPushMessage:message.body];
  289. }else if ([message.name isEqualToString:@"hideRedSpotOnMenu"]) {
  290. [self jsHideRedSpotOnMenu:message.body];
  291. }else if ([message.name isEqualToString:@"showRedSpotOnMenu"]) {
  292. [self jsShowRedSpotOnMenu:message.body];
  293. }else if ([message.name isEqualToString:@"wxPay"]) {
  294. [self jsWxPay:message.body];
  295. }else if ([message.name isEqualToString:@"aliPay"]) {
  296. [self jsAliPay:message.body];
  297. }else if ([message.name isEqualToString:@"skipCameraWithParam"]) {
  298. [self jsSkipCameraWithParam:message.body];
  299. }else if ([message.name isEqualToString:@"skipAlbumWithParam"]) {
  300. [self jsSkipAlbumWithParam:message.body];
  301. }else if ([message.name isEqualToString:@"openActivityPage"]) {
  302. [self jsOpenActivityPage:message.body];
  303. }else if ([message.name isEqualToString:@"callPhone"]) {
  304. [self jsCallPhone:message.body];
  305. }else if ([message.name isEqualToString:@"openOtherAppLinks"]) {
  306. [self jsOpenOtherAppLinks:message.body];
  307. }else if ([message.name isEqualToString:@"inPurchasingVip"]) {
  308. [self jsInPurchasingVip:message.body];
  309. }else if ([message.name isEqualToString:@"wirteRight"]) {
  310. [self jsWirteRight:message.body];
  311. }else if ([message.name isEqualToString:@"clearRight"]) {
  312. [self jsClearRight:message.body];
  313. }else if ([message.name isEqualToString:@"savePic"]) {
  314. [self jsSavePic:message.body];
  315. }else if ([message.name isEqualToString:@"ocrVerifyService"]) {
  316. [self jsOcrVerifyService:message.body];
  317. }else if ([message.name isEqualToString:@"faceVerifyService"]) {
  318. [self jsFaceVerifyService:message.body];
  319. }else if ([message.name isEqualToString:@"skipAppointTab"]) {
  320. [self jsSkipAppointTab:message.body];
  321. }else if ([message.name isEqualToString:@"refreshAppointTab"]) {
  322. [self jsRefreshAppointTab:message.body];
  323. }else {
  324. }
  325. }
  326. #pragma mark - WKUIDelegate
  327. - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler
  328. {
  329. NSError *err = nil;
  330. NSData *dataFromString = [prompt dataUsingEncoding:NSUTF8StringEncoding];
  331. NSDictionary *paramdict = [NSJSONSerialization JSONObjectWithData:dataFromString options:NSJSONReadingMutableContainers error:&err];
  332. // NSLog(@"拦截%@",paramdict);
  333. if (!err){
  334. NSString *type = [paramdict objectForKey:@"jsName"];
  335. if (type && [type isEqualToString:@"getUserToken"]) {
  336. NSDictionary *dict = @{@"type":@"string",
  337. @"value":[self jsGetUserToken:paramdict]};
  338. completionHandler([self convertToJsonData:dict]);
  339. }else if (type && [type isEqualToString:@"getVersion"]) {
  340. NSDictionary *dict = @{@"type":@"string",
  341. @"value":[self jsGetVersion:paramdict]};
  342. completionHandler([self convertToJsonData:dict]);
  343. }else if (type && [type isEqualToString:@"checkNoticePermission"]) {
  344. NSDictionary *dict = @{@"type":@"int",
  345. @"value":[NSString stringWithFormat:@"%d",[self jsCheckNoticePermission:paramdict]]};
  346. completionHandler([self convertToJsonData:dict]);
  347. }else if (type && [type isEqualToString:@"getPushRid"]) {
  348. NSDictionary *dict = @{@"type":@"string",@"value":[self jsGetPushRid:paramdict]};
  349. completionHandler([self convertToJsonData:dict]);
  350. }else if (type && [type isEqualToString:@"isInstallWeixin"]) {
  351. NSDictionary *dict = @{@"type":@"int",
  352. @"value":[NSString stringWithFormat:@"%d",[self jsIsInstallWeixin:paramdict]]};
  353. completionHandler([self convertToJsonData:dict]);
  354. }else if (type && [type isEqualToString:@"getCipherText"]) {
  355. NSDictionary *dict = @{@"type":@"string",
  356. @"value":[self jsGetCipherText:paramdict]};
  357. completionHandler([self convertToJsonData:dict]);
  358. }
  359. else if (type && [type isEqualToString:@"getOtherPushRid"]) {
  360. NSDictionary *dict = @{@"type":@"string",@"value":[self jsGetOtherPushRid:paramdict]};
  361. completionHandler([self convertToJsonData:dict]);
  362. }else if (type && [type isEqualToString:@"getPhoneBrand"]) {
  363. NSDictionary *dict = @{@"type":@"string",
  364. @"value":[self jsGetPhoneBrand:paramdict]};
  365. completionHandler([self convertToJsonData:dict]);
  366. }else if (type && [type isEqualToString:@"readRight"]) {
  367. NSDictionary *dict = @{@"type":@"string",
  368. @"value":[self jsReadRight:paramdict]};
  369. completionHandler([self convertToJsonData:dict]);
  370. }else if (type && [type isEqualToString:@"checkLocationPermission"]) {
  371. NSDictionary *dict = @{@"type":@"int",
  372. @"value":[NSString stringWithFormat:@"%d",[self jsCheckLocationPermission:paramdict]]
  373. };
  374. completionHandler([self convertToJsonData:dict]);
  375. }else {
  376. completionHandler(@"");
  377. }
  378. }
  379. }
  380. //通过js alert 显示一个警告面板,调用原生会走此方法。
  381. - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
  382. {
  383. NSLog(@"显示一个JavaScript警告面板, message = %@",message);
  384. UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"温馨提示" message:message preferredStyle:UIAlertControllerStyleAlert];
  385. [alertController addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  386. completionHandler();
  387. }]];
  388. [self presentViewController:alertController animated:YES completion:nil];
  389. }
  390. //通过 js confirm 显示一个确认面板,调用原生会走此方法。
  391. - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler
  392. {
  393. NSLog(@"运行JavaScript确认面板, message = %@", message);
  394. UIAlertController *action = [UIAlertController alertControllerWithTitle:@"温馨提示" message:message preferredStyle:UIAlertControllerStyleAlert];
  395. [action addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
  396. completionHandler(NO);
  397. }] ];
  398. [action addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  399. completionHandler(YES);
  400. }]];
  401. [self presentViewController:action animated:YES completion:nil];
  402. }
  403. #pragma mark - OC调JS交互
  404. -(void)isExitCallToJS:(NSString *)jsStr withMethodName:(NSString *)name{
  405. NSString *jsName = [NSString stringWithFormat:@"function exist(){return !window['%@']};exist()",name];
  406. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.15 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  407. WeakSelf;
  408. [_webView evaluateJavaScript:jsName completionHandler:^(id _Nullable result, NSError * _Nullable error) {
  409. // NSLog(@"是否存在 result:%@,error:%@",result,error);
  410. if ([result intValue]==0) {
  411. [weakSelf executeCallJS:jsStr];
  412. }else {
  413. NSLog(@"不存在-不存在-不存在-%@",jsStr);
  414. }
  415. }];
  416. });
  417. }
  418. -(void)executeCallJS:(NSString *)jsStr {
  419. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.15 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  420. [_webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
  421. if (error!=nil) {
  422. }
  423. }];
  424. });
  425. }
  426. - (void)viewDidLoad {
  427. [super viewDidLoad];
  428. // Do any additional setup after loading the view.
  429. NSLog(@"我的初始化");
  430. self.view.backgroundColor = [UIColor whiteColor];
  431. [self.view addSubview:self.webView];
  432. [self.view addSubview:self.progressView];
  433. [self webViewFirstRequest];
  434. [[AFNetworkReachabilityManager sharedManager] startMonitoring];
  435. [self initNotification];
  436. self.recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(paningGestureReceive:)];
  437. [self.recognizer delaysTouchesBegan];
  438. [self.view addGestureRecognizer:self.recognizer];
  439. //监听底部栏
  440. [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(bottomFourListening) userInfo:nil repeats:YES];
  441. }
  442. -(void)bottomFourListening {
  443. if(self.tabBarController.selectedIndex == 3) {
  444. [self judgeIsHiddenBottom];
  445. }
  446. }
  447. #pragma mark - WKNavigationDelegate
  448. /* 页面加载完成 */
  449. - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
  450. NSLog(@"-----页面加载完成%@",webView.URL.absoluteString);
  451. if (![GlobalData shareInstance].isMineToLoad) {
  452. [GlobalData shareInstance].isMineToLoad = YES;
  453. }
  454. [self judgeIsHiddenBottom];
  455. [self removeNoNetViews];
  456. [self removeFailNetViews];
  457. [[LXViewControllerManager shareViewControllerManager] hideHud];
  458. [self.webView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:nil];
  459. // [self.webView evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';"completionHandler:nil];
  460. //写数据
  461. // [self writeWKWebData:webView.URL];
  462. }
  463. -(void)writeWKWebData:(NSURL *)url {
  464. //得到NSData 数据
  465. NSData *dataContent = [NSData dataWithContentsOfURL:url];
  466. //NSURLCache 实例化
  467. NSURLCache *cache = [NSURLCache sharedURLCache];
  468. //得到相应
  469. NSURLResponse *response = [[NSURLResponse alloc]initWithURL:url MIMEType:@"text/html" expectedContentLength:0 textEncodingName:@"UTF-8"];
  470. //得到CacheURLResponse
  471. NSCachedURLResponse *cacheResponse = [[NSCachedURLResponse alloc]initWithResponse:response data:dataContent];
  472. //进行存储
  473. [cache storeCachedResponse:cacheResponse forRequest:[NSURLRequest requestWithURL:url]];
  474. }
  475. // 页面开始加载时调用
  476. - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
  477. self.recognizer.enabled = NO;
  478. }
  479. // 当内容开始返回时调用
  480. - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
  481. }
  482. // 页面加载失败时调用
  483. - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(nonnull NSError *)error{
  484. //加载失败 有网络-弹出页面 , 无网络-记录标记
  485. if ([ZKMethod judegeNetworkIsAvailable]) {
  486. //弹出页面
  487. NSLog(@"页面加载失败-有网络");
  488. if (!self.isRuningLoad) {
  489. [self addFailNetViews];
  490. }
  491. }else {
  492. //记录标记
  493. NSLog(@"页面加载失败-无网络");
  494. isExistNoNewWork = YES;
  495. }
  496. self.recognizer.enabled = YES;
  497. }
  498. #pragma mark *****JS与OC交互
  499. #pragma mark - WKScriptMessageHandler JS调OC交互
  500. -(void)jsLoginByWeixin:(NSDictionary *)dict {
  501. if ([LXUserDefaults isInstallWeiXin] != 1) { // 没有安装微信 不走友盟
  502. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"微信登录失败,没有安装微信" delay:1.5];
  503. return;
  504. }
  505. [[UMSocialManager defaultManager] getUserInfoWithPlatform:UMSocialPlatformType_WechatSession currentViewController:self completion:^(id result, NSError *error) {
  506. UMSocialUserInfoResponse *resp = result;
  507. [self dealWXDic:(NSDictionary *)resp.originalResponse];
  508. [[LXViewControllerManager shareViewControllerManager] hideHud];
  509. }];
  510. }
  511. // 处理微信登录获取到的数据
  512. -(void)dealWXDic:(NSDictionary *)dictionary{
  513. [[LXViewControllerManager shareViewControllerManager] showHudText:nil];
  514. //如果获取到用户信息,即用户点击了“登录”,则进行用户信息获取
  515. if (dictionary.count > 0) {
  516. NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:dictionary];
  517. if (dic) {
  518. [dic removeObjectForKey:@"privilege"];
  519. [dic removeObjectForKey:@"language"];
  520. double currDouble = [[NSDate date] timeIntervalSince1970];
  521. [dic setObject:[NSNumber numberWithLong:(long)currDouble] forKey:@"createtime"];
  522. // 拼接标志位
  523. NSString *sign = [NSString stringWithFormat:@"city=%@&country=%@&createtime=%@&headimgurl=%@&nickname=%@&openid=%@&province=%@&sex=%@&unionid=%@", dic[@"city"], dic[@"country"], dic[@"createtime"], dic[@"headimgurl"], dic[@"nickname"], dic[@"openid"], dic[@"province"],dic[@"sex"],dic[@"unionid"]];
  524. sign = [LXMD5 md532BitLower:sign];
  525. [dic setObject:sign forKey:@"sign"];
  526. NSString *endStr = [[LXViewControllerManager shareViewControllerManager] getJsonStr:dic];
  527. NSData *data = [endStr dataUsingEncoding:NSUTF8StringEncoding];
  528. endStr = [data base64EncodedStringWithOptions:0];
  529. [self isExitCallToJS:[NSString stringWithFormat:@"loginByWeixinCallBack('%@')", endStr] withMethodName:@"loginByWeixinCallBack"];
  530. }
  531. }
  532. }
  533. -(void)jsShare:(NSDictionary *)dict {
  534. NSString *type = [NSString stringWithFormat:@"%@",dict[@"type"]];
  535. NSString *title = [NSString stringWithFormat:@"%@",dict[@"title"]];
  536. NSString *content = [NSString stringWithFormat:@"%@",dict[@"content"]];
  537. NSString *link = [NSString stringWithFormat:@"%@",dict[@"link"]];
  538. UMSocialPlatformType shareType;
  539. if ([type intValue] == 1) { // 微信好友
  540. shareType = UMSocialPlatformType_WechatSession;
  541. }else if ([type intValue] == 2){ /// qq好友
  542. shareType = UMSocialPlatformType_QQ;
  543. }else if ([type intValue] == 3){ // 朋友圈
  544. shareType = UMSocialPlatformType_WechatTimeLine;
  545. }else{
  546. shareType = UMSocialPlatformType_WechatSession;
  547. }
  548. if ([type intValue] == 1 || [type intValue] == 3) {
  549. if ([LXUserDefaults isInstallWeiXin] != 1) {
  550. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"没有安装微信" delay:1.5];
  551. return;
  552. }
  553. }
  554. if ([type intValue] == 2) {
  555. if (![[UMSocialManager defaultManager] isInstall:UMSocialPlatformType_QQ]) {
  556. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"没有安装QQ" delay:1.5];
  557. return;
  558. }
  559. }
  560. //创建分享消息对象
  561. UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
  562. //创建网页内容对象
  563. UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:content thumImage:[UIImage imageNamed:@"logo"]];
  564. //设置网页地址
  565. shareObject.webpageUrl = link;
  566. messageObject.shareObject = shareObject;
  567. //调用分享接口
  568. [[UMSocialManager defaultManager] shareToPlatform:shareType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
  569. NSLog(@"%@",error);
  570. if (error) {
  571. if (error.userInfo[@"message"] && [error.userInfo[@"message"] containsString:@"Operation is cancel"]) {
  572. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"取消分享" delay:1];
  573. }else{
  574. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:error.userInfo[@"message"] delay:1];
  575. }
  576. [self isExitCallToJS:[NSString stringWithFormat:@"shareCallBack('%@','%@')",type,@"0"] withMethodName:@"shareCallBack"];
  577. }else{
  578. if ([data isKindOfClass:[UMSocialShareResponse class]]) {
  579. [self isExitCallToJS:[NSString stringWithFormat:@"shareCallBack('%@','%@')",type,@"1"] withMethodName:@"shareCallBack"];
  580. }else{
  581. UMSocialLogInfo(@"response data is %@",data);
  582. }
  583. }
  584. }];
  585. }
  586. -(void)jsSaveUserToken:(NSDictionary *)dict{
  587. [[LXViewControllerManager shareViewControllerManager] hideHud];
  588. [LXUserDefaults saveToken:[NSString stringWithFormat:@"%@",dict[@"token"]]];
  589. }
  590. -(NSString *)jsGetUserToken:(NSDictionary *)dict{
  591. return [LXUserDefaults token];
  592. }
  593. -(void)jsRemoveUserToken:(NSDictionary *)dict{
  594. [LXUserDefaults clearAll];
  595. }
  596. -(int)jsCheckNoticePermission:(NSDictionary *)dict{
  597. if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {
  598. return 1;
  599. }
  600. return 0;
  601. }
  602. // 跳转到系统设置
  603. -(void)jsOpenSystemNotification:(NSDictionary *)dict{
  604. [[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
  605. }
  606. // 获取推送id
  607. -(NSString *)jsGetPushRid:(NSDictionary *)dict{
  608. return [LXUserDefaults grpcPushID];
  609. }
  610. // 打开新页面 加载新web
  611. -(void)JsOpenExternalLink:(NSDictionary *)dict{
  612. NSString *url = [NSString stringWithFormat:@"%@",dict[@"url"]];
  613. NSString *title = [NSString stringWithFormat:@"%@",dict[@"title"]];
  614. if (url) {
  615. if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable || [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusUnknown) {
  616. }
  617. JYWKNewWebController *ctr = [[JYWKNewWebController alloc] init];
  618. ctr.url = url;
  619. if (!title || [title isEqualToString:@""]||[title isEqualToString:@"undefined"]) {
  620. ctr.titleShow = nil;
  621. }else{
  622. ctr.titleShow = title;
  623. }
  624. kMainQueue(^{
  625. [self presentViewController:ctr animated:NO completion:nil];
  626. });
  627. }
  628. }
  629. // 获取当前版本号
  630. -(NSString *)jsGetVersion:(NSDictionary *)dict{
  631. return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  632. }
  633. -(void)jsAlert:(NSDictionary *)dict{
  634. [[LXViewControllerManager shareViewControllerManager] showAlertViewWithMessage:[NSString stringWithFormat:@"%@",dict[@"content"]]];
  635. }
  636. -(int)jsIsInstallWeixin:(NSDictionary *)dict{
  637. return [LXUserDefaults isInstallWeiXin];
  638. }
  639. -(NSString *)jsGetCipherText:(NSDictionary *)dict{
  640. NSDictionary *objDict = [NSDictionary dictionaryWithDictionary:dict[@"arguments"]];
  641. NSString *phone = [NSString stringWithFormat:@"%@",objDict[@"phone"]];
  642. NSDate *date=[NSDate date];
  643. NSDateFormatter *format1=[[NSDateFormatter alloc] init];
  644. [format1 setDateFormat:@"yyyyMMddhhmmss"];
  645. NSString *dateStr;
  646. dateStr=[format1 stringFromDate:date];
  647. NSString *content = [[NSString stringWithFormat:@"%@_%@",phone,dateStr] stringByAppendingString:[NSString stringWithFormat:@"_%@",[LXMD5 md532BitLower:[NSString stringWithFormat:@"%@&%@",phone,dateStr]]]];
  648. NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
  649. NSUInteger dataLength = contentData.length;
  650. // 为结束符'\\0' +1
  651. char keyPtr[new_kKeySize_4 + 1];
  652. memset(keyPtr, 0, sizeof(keyPtr));
  653. [new_AesKey_4 getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  654. // 密文长度 <= 明文长度 + BlockSize
  655. size_t encryptSize = dataLength + kCCBlockSizeAES128;
  656. void *encryptedBytes = malloc(encryptSize);
  657. size_t actualOutSize = 0;
  658. NSData *initVector = [new_kInitVector_4 dataUsingEncoding:NSUTF8StringEncoding];
  659. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  660. kCCAlgorithmAES,
  661. kCCOptionPKCS7Padding, // 系统默认使用 CBC,然后指明使用 PKCS7Padding
  662. keyPtr,
  663. new_kKeySize_4,
  664. initVector.bytes,
  665. contentData.bytes,
  666. dataLength,
  667. encryptedBytes,
  668. encryptSize,
  669. &actualOutSize);
  670. if (cryptStatus == kCCSuccess) {
  671. // 对加密后的数据进行 base64 编码
  672. return [[NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
  673. }
  674. free(encryptedBytes);
  675. return nil;
  676. }
  677. -(void)jsHiddenBottom:(NSDictionary *)dict{
  678. if(self.tabBarController.selectedIndex == 3) {
  679. if([[NSString stringWithFormat:@"%@",dict[@"hidden"]] integerValue]==0) {
  680. [self hideTabBar];
  681. [self hiddenMethodTabBar];
  682. }else {
  683. [self showTabBar];
  684. [self showMethodTabBar];
  685. }
  686. }
  687. }
  688. -(void)jsCheckLab:(NSDictionary *)dict {
  689. [[NSNotificationCenter defaultCenter] postNotificationName:RefreshNonCurVC object:nil userInfo:nil];
  690. }
  691. //js方法登录成功
  692. -(void)jsLoginSuccess:(NSDictionary *)dict {
  693. NSLog(@"mine登录成功提示");
  694. NSString *status = [NSString stringWithFormat:@"%@",dict[@"status"]];
  695. [GlobalData shareInstance].isReLogin = YES;
  696. if([status isEqualToString:@"S"]) {
  697. kMainQueue(^{
  698. [[NSNotificationCenter defaultCenter] postNotificationName:RefreshAllVC object:nil userInfo:nil];
  699. AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  700. JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController;
  701. tab.selectedIndex = 0;
  702. //
  703. });
  704. }else {
  705. }
  706. //弹出页面
  707. if ([GlobalData shareInstance].isPasteLogin) {
  708. [GlobalData shareInstance].isPasteLogin = NO;
  709. NSString *content = [UIPasteboard generalPasteboard].string;
  710. [self popPasteVIew:content];
  711. }
  712. }
  713. -(void)jsBackUrl:(NSDictionary *)dict {
  714. NSString *status = [NSString stringWithFormat:@"%@",dict[@"status"]];
  715. NSLog(@"sub返回");
  716. if([status isEqualToString:@"H"]) {
  717. //测试返回首页
  718. kMainQueue(^{
  719. [[NSNotificationCenter defaultCenter] postNotificationName:RefreshAllVC object:nil userInfo:nil];
  720. AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  721. JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController;
  722. tab.selectedIndex = 0;
  723. });
  724. }
  725. }
  726. -(void)jsClearPushMessage:(NSDictionary *)dict {
  727. kMainQueue(^{
  728. [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
  729. [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
  730. });
  731. }
  732. -(void)jsHideRedSpotOnMenu:(NSDictionary *)dict {
  733. NSString *menu = [NSString stringWithFormat:@"%@",dict[@"menu"]];
  734. if([menu isEqualToString:@"subscribe"]) {
  735. kMainQueue(^{
  736. [self.tabBarController.tabBar hideBadgeOnItemIndex:1];
  737. });
  738. }
  739. if([menu isEqualToString:@"my"]) {
  740. kMainQueue(^{
  741. [self.tabBarController.tabBar hideBadgeOnItemIndex:3];
  742. });
  743. }
  744. }
  745. -(void)jsShowRedSpotOnMenu:(NSDictionary *)dict {
  746. NSString *menu = [NSString stringWithFormat:@"%@",dict[@"menu"]];
  747. if([menu isEqualToString:@"subscribe"]) {
  748. kMainQueue(^{
  749. [self.tabBarController.tabBar showBadgeOnItemIndex:1];
  750. });
  751. }
  752. if([menu isEqualToString:@"my"]) {
  753. kMainQueue(^{
  754. [self.tabBarController.tabBar showBadgeOnItemIndex:3];
  755. });
  756. }
  757. }
  758. -(void)jsWxPay:(NSDictionary *)dict {
  759. if (![LXUserDefaults isInstallWeiXin]) { [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"请先安装微信再进行支付!" delay:1.5];
  760. return;
  761. }
  762. NSString *jsonString = [NSString stringWithFormat:@"%@",dict[@"order"]];
  763. NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  764. NSError *err;
  765. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
  766. if(err) {
  767. NSLog(@"json解析失败:%@",err);
  768. return;
  769. }
  770. //吊起微信
  771. PayReq *request = [[PayReq alloc] init] ;
  772. request.openID = dic[@"Appid"];
  773. request.partnerId = dic[@"Partnerid"];
  774. request.prepayId= dic[@"Prepayid"];
  775. request.package = @"Sign=WXPay";
  776. request.nonceStr= dic[@"Noncestr"];
  777. request.timeStamp= [dic[@"Timestamp"] intValue];
  778. request.sign= dic[@"Sign"];
  779. kMainQueue(^{
  780. [WXApi sendReq:request];
  781. });
  782. }
  783. -(void)jsAliPay:(NSDictionary *)dict {
  784. if (![LXUserDefaults isInstallAli]) {
  785. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"请先安装支付宝再进行支付!" delay:1.5];
  786. return;
  787. }
  788. NSString *order = [NSString stringWithFormat:@"%@",dict[@"order"]];
  789. kMainQueue(^{
  790. [[AlipaySDK defaultService] payOrder:order fromScheme:@"jianyuiosapp" callback:nil];
  791. });
  792. }
  793. -(NSString *)jsGetOtherPushRid:(NSDictionary *)dict {
  794. return [LXUserDefaults deviceToken];
  795. }
  796. -(NSString *)jsGetPhoneBrand:(NSDictionary *)dict {
  797. UIDevice *device = [UIDevice currentDevice];
  798. return device.platformString;
  799. }
  800. //拍照上传图片
  801. -(void)jsSkipCameraWithParam:(NSDictionary *)dict {
  802. [GlobalData shareInstance].isSkipPath = [NSString stringWithFormat:@"%@",dict[@"type"]];
  803. UIImagePickerController *picker = [[UIImagePickerController alloc] init];
  804. picker.delegate = self;
  805. picker.allowsEditing = YES;
  806. picker.sourceType = UIImagePickerControllerSourceTypeCamera;
  807. dispatch_async(dispatch_get_main_queue(), ^{
  808. [self presentViewController:picker animated:YES completion:nil];
  809. });
  810. }
  811. //相册选择照片
  812. -(void)jsSkipAlbumWithParam:(NSDictionary *)dict {
  813. [GlobalData shareInstance].isSkipPath = [NSString stringWithFormat:@"%@",dict[@"type"]];
  814. UIImagePickerController *picker = [[UIImagePickerController alloc] init];
  815. picker.delegate = self;
  816. picker.allowsEditing = YES;
  817. picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  818. dispatch_async(dispatch_get_main_queue(), ^{
  819. [self presentViewController:picker animated:YES completion:nil];
  820. });
  821. }
  822. -(void)jsOpenActivityPage:(NSDictionary *)dict {
  823. NSDictionary * infoDic = @{@"url":[NSString stringWithFormat:@"%@",dict[@"url"]],
  824. @"rectype":[NSString stringWithFormat:@"%@",dict[@"rectype"]],
  825. @"openid":[NSString stringWithFormat:@"%@",dict[@"openid"]],
  826. };
  827. //post请求
  828. NSLog(@"%@",[NSString stringWithFormat:@"%@jyapp/free/message/receive",kHost]);
  829. [[LXNetworkManager shareLXNetworkManager]postWithURLStr:[NSString stringWithFormat:@"%@jyapp/free/message/receive",kHost] parameters:infoDic progress:^(NSProgress *progress) {
  830. NSLog(@"成功:%@",progress);
  831. } success:^(id responseObject) {
  832. NSLog(@"responseObject=%@",responseObject);
  833. } failure:^(NSError *error) {
  834. NSLog(@"error=%@",error);
  835. }];
  836. }
  837. //拨打电话
  838. -(void)jsCallPhone:(NSDictionary *)dict {
  839. NSString *phone = [NSString stringWithFormat:@"%@",dict[@"phone"]];
  840. NSMutableString *tel = [[NSMutableString alloc]initWithFormat:@"telprompt://%@",phone];
  841. if (@available(iOS 10.0, *)) {
  842. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tel] options:@{} completionHandler:^(BOOL success) {
  843. }];
  844. } else {
  845. // Fallback on earlier versions
  846. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tel]];
  847. }
  848. }
  849. //打开其他app 抖音+快手
  850. -(void)jsOpenOtherAppLinks:(NSDictionary *)dict {
  851. //测试跳转抖音--快手 @"gifshow://" @"snssdk1128://"
  852. NSString *appLink = [NSString stringWithFormat:@"%@",dict[@"appLink"]];
  853. NSString *appName = [NSString stringWithFormat:@"%@",dict[@"appName"]];
  854. NSLog(@"appName:%@",appName);
  855. NSURL *url = [NSURL URLWithString:appLink];
  856. if ([[UIApplication sharedApplication] canOpenURL:url]) {
  857. if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
  858. //iOS 10.0+
  859. NSLog(@"iOS 10+");
  860. if (@available(iOS 10.0, *)) {
  861. [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
  862. if (!success) {
  863. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:appName delay:2];
  864. }
  865. }];
  866. } else {
  867. // Fallback on earlier versions
  868. [[UIApplication sharedApplication] openURL:url];
  869. }
  870. }else{
  871. NSLog(@"iOS 2~10");
  872. //iOS 2~10
  873. [[UIApplication sharedApplication] openURL:url];
  874. }
  875. }else{
  876. //一般是没有安装
  877. NSLog(@"跳转下载app链接");
  878. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:appName delay:2];
  879. }
  880. }
  881. #pragma mark *****人脸核身
  882. //ocr验证
  883. -(void)jsOcrVerifyService:(NSDictionary *)dict{
  884. NSLog(@"ocr:%@",dict);
  885. NSString *orderNo = [NSString stringWithFormat:@"%@",dict[@"orderNo"]];
  886. NSString *nonce = [NSString stringWithFormat:@"%@",dict[@"nonce"]];
  887. NSString *userId = [NSString stringWithFormat:@"%@",dict[@"userId"]];
  888. NSString *sign = [NSString stringWithFormat:@"%@",dict[@"sign"]];
  889. kMainQueue((^{
  890. WBOCRConfig *config = [WBOCRConfig sharedConfig];
  891. config.needRecordVideo = NO;
  892. config.SDKType = WBOCRSDKTypeIDCardNormal; // 身份证两面识别
  893. [[WBOCRService sharedService] startOCRServiceWithConfig:config version:@"1.0.0" appId:OCRAPPID nonce:nonce userId:userId sign:sign orderNo:orderNo startSucceed:^{
  894. /** SDK服务拉起成功回调 */
  895. NSLog(@"启动SDK成功!!!");
  896. } recognizeSucceed:^(id _Nonnull resultModel, id _Nullable extension) {
  897. /** SDK本次识别成功回调 */
  898. NSLog(@"SDK识别成功!!!");
  899. //调用js - 告知成功
  900. NSString *textJS = [NSString stringWithFormat:@"ocrVerifyResult('%@')",orderNo];
  901. [self isExitCallToJS:textJS withMethodName:@"ocrVerifyResult"];
  902. } failed:^(NSError * _Nonnull error, id _Nullable extension) {
  903. /** SDK异常回调 */
  904. NSLog(@"识别出错!!!"); //200101 用户取消操作
  905. //弹出页面
  906. if (error.code == 200101) {
  907. self.verifyMsgView.descTitle = @"您取消了身份验证";
  908. }else {
  909. self.verifyMsgView.descTitle = @"身份验证失败";
  910. }
  911. [self.verifyMsgView show];
  912. NSString *textJS = [NSString stringWithFormat:@"ocrVerifyResult('%@')",@""];
  913. [self isExitCallToJS:textJS withMethodName:@"ocrVerifyResult"];
  914. }];
  915. }));
  916. }
  917. //人脸核身
  918. -(void)jsFaceVerifyService:(NSDictionary *)dict {
  919. NSLog(@"face:%@",dict);
  920. NSString *orderNo = [NSString stringWithFormat:@"%@",dict[@"orderNo"]];
  921. NSString *nonce = [NSString stringWithFormat:@"%@",dict[@"nonce"]];
  922. NSString *userId = [NSString stringWithFormat:@"%@",dict[@"userId"]];
  923. NSString *sign = [NSString stringWithFormat:@"%@",dict[@"sign"]];
  924. NSString *faceId = [NSString stringWithFormat:@"%@",dict[@"faceId"]];
  925. kMainQueue((^{
  926. [WBFaceVerifyCustomerService sharedInstance].delegate = self;
  927. WBFaceVerifySDKConfig *config = [WBFaceVerifySDKConfig sdkConfig];
  928. config.recordVideo = NO;
  929. config.theme = WBFaceVerifyThemeDarkness;
  930. [[WBFaceVerifyCustomerService sharedInstance] loginInLiveCheckAndCompareWithSourceImageService:userId nonce:nonce sign:sign appid:OCRAPPID orderNo:orderNo apiVersion:@"1.0.0" licence:LICENCE faceType:WBFaceVerifyLivingType_Action faceId:faceId sdkConfig:config success:^{
  931. } failure:^(WBFaceError * _Nonnull error) {
  932. }];
  933. }));
  934. }
  935. #pragma mark - WBFaceVerifyCustomerServiceDelegate
  936. -(void)wbfaceVerifyCustomerServiceDidFinishedWithFaceVerifyResult:(WBFaceVerifyResult *)faceVerifyResult{
  937. if (faceVerifyResult.isSuccess) {
  938. NSLog(@"活体检测成功:%@",faceVerifyResult.orderNo);
  939. NSString *textJS = [NSString stringWithFormat:@"faceVerifyResult('%@')",faceVerifyResult.orderNo];
  940. [self isExitCallToJS:textJS withMethodName:@"faceVerifyResult"];
  941. self.verifyMsgView.descTitle = @"活体检测成功";
  942. [self.verifyMsgView show];
  943. }else {
  944. NSLog(@"活体检测失败");
  945. self.verifyMsgView.descTitle = @"活体检测失败";
  946. [self.verifyMsgView show];
  947. NSString *textJS = [NSString stringWithFormat:@"faceVerifyResult('%@')",@""];
  948. [self isExitCallToJS:textJS withMethodName:@"faceVerifyResult"];
  949. }
  950. }
  951. //保存图片到相册
  952. #pragma mark 保存图片
  953. -(void)jsSavePic:(NSDictionary *)dict {
  954. NSString *base64ImgData = [NSString stringWithFormat:@"%@",dict[@"imgbase64"]];
  955. NSData *data = [[NSData alloc]initWithBase64EncodedString:base64ImgData options:NSDataBase64DecodingIgnoreUnknownCharacters];
  956. UIImage *saveImg = [UIImage imageWithData:data];
  957. UIImageWriteToSavedPhotosAlbum(saveImg, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
  958. }
  959. #pragma mark 系统的完成保存图片的方法
  960. - (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo
  961. {
  962. NSString *msg = nil ;
  963. if (error != NULL) {
  964. msg = @"保存图片失败" ;
  965. } else {
  966. msg = @"保存图片成功" ;
  967. }
  968. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:msg delay:1];
  969. }
  970. #pragma mark 粘贴板
  971. -(void)jsWirteRight:(NSDictionary *)dict {
  972. NSString *txt = [NSString stringWithFormat:@"%@",dict[@"txt"]];
  973. [[UIPasteboard generalPasteboard]setString:txt];
  974. }
  975. -(void)jsClearRight:(NSDictionary *)dict {
  976. //清粘贴板数据
  977. [[UIPasteboard generalPasteboard]setString:@""];
  978. }
  979. -(NSString *)jsReadRight:(NSDictionary *)dict {
  980. NSString *content = [UIPasteboard generalPasteboard].string;
  981. return content;
  982. }
  983. //返回定位可用信息
  984. -(int)jsCheckLocationPermission:(NSDictionary *)dict {
  985. if ([CLLocationManager locationServicesEnabled]) {
  986. //询问方式:
  987. if ([CLLocationManager authorizationStatus]!= kCLAuthorizationStatusDenied) {
  988. if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined) {
  989. NSLog(@"询问");
  990. //
  991. return -1;
  992. }
  993. NSLog(@"开启");
  994. return 1;
  995. }
  996. }
  997. NSLog(@"未开启");
  998. return 0;
  999. }
  1000. //内购VIP
  1001. -(void)jsInPurchasingVip:(NSDictionary *)dict {
  1002. NSString *productid = [NSString stringWithFormat:@"%@",dict[@"productid"]];
  1003. //产品id
  1004. if ([productid isEqualToString:@""]) {
  1005. NSLog(@"订单号 有问题");
  1006. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"订单号异常,请重试" delay:1];
  1007. return;
  1008. }
  1009. [[LXViewControllerManager shareViewControllerManager] showHudText:@"苹果验证中,请稍候"];
  1010. if([SKPaymentQueue canMakePayments]){
  1011. [self requestProductData:productid];
  1012. }else{
  1013. [[LXViewControllerManager shareViewControllerManager] hideHud];
  1014. }
  1015. }
  1016. //去苹果服务器请求商品
  1017. - (void)requestProductData:(NSString *)type {
  1018. NSArray *product = [[NSArray alloc] initWithObjects:type,nil];
  1019. NSSet *nsset = [NSSet setWithArray:product];
  1020. SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
  1021. request.delegate = self;
  1022. [request start];
  1023. }
  1024. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
  1025. NSArray *myProduct = response.products;
  1026. if (myProduct.count == 0) {
  1027. NSLog(@"无法获取产品信息,购买失败。");
  1028. [[LXViewControllerManager shareViewControllerManager]showHudOnlyText:@"暂时未获取到产品信息,请重试" delay:1];
  1029. return;
  1030. }
  1031. SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];
  1032. [[SKPaymentQueue defaultQueue] addPayment:payment];
  1033. }
  1034. //切换模块
  1035. -(void)jsSkipAppointTab:(NSDictionary *)dict {
  1036. if(self.tabBarController.selectedIndex == 3) {
  1037. AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  1038. JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController;
  1039. NSString *name = [NSString stringWithFormat:@"%@",dict[@"name"]];
  1040. if ([name isEqualToString:@"search"]) {
  1041. tab.selectedIndex = 0;//切换底部栏
  1042. }else if ([name isEqualToString:@"subscribe"]) {
  1043. tab.selectedIndex = 1;//切换底部栏
  1044. }else if ([name isEqualToString:@"box"]) {
  1045. tab.selectedIndex = 2;//切换底部栏
  1046. }else if ([name isEqualToString:@"me"]) {
  1047. tab.selectedIndex = 3;//切换底部栏
  1048. }else {
  1049. }
  1050. }
  1051. }
  1052. //刷新模块页面
  1053. -(void)jsRefreshAppointTab:(NSDictionary *)dict {
  1054. if(self.tabBarController.selectedIndex == 3) {
  1055. [[NSNotificationCenter defaultCenter] postNotificationName:JYRefreshMenusView object:nil userInfo:dict];
  1056. }
  1057. }
  1058. #pragma mark *****其他方法
  1059. -(void)judgeIsHiddenBottom {
  1060. if(self.tabBarController.selectedIndex == 3) {
  1061. NSString *current_url = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
  1062. if([current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/free/me",kHost]]){
  1063. [self showTabBar];
  1064. [self showMethodTabBar];
  1065. }else {
  1066. [self hideTabBar];
  1067. [self hiddenMethodTabBar];
  1068. }
  1069. }
  1070. }
  1071. - (void)hideTabBar {
  1072. kMainQueue(^{
  1073. if (self.tabBarController.tabBar.hidden == YES) {
  1074. return;
  1075. }
  1076. UIView *contentView;
  1077. if ( [[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] )
  1078. contentView = [self.tabBarController.view.subviews objectAtIndex:1];
  1079. else
  1080. contentView = [self.tabBarController.view.subviews objectAtIndex:0];
  1081. contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height + self.tabBarController.tabBar.frame.size.height);
  1082. self.tabBarController.tabBar.hidden = YES;
  1083. });
  1084. }
  1085. - (void)showTabBar{
  1086. kMainQueue(^{
  1087. if (self.tabBarController.tabBar.hidden == NO)
  1088. {
  1089. return;
  1090. }
  1091. UIView *contentView;
  1092. if ([[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]])
  1093. contentView = [self.tabBarController.view.subviews objectAtIndex:1];
  1094. else
  1095. contentView = [self.tabBarController.view.subviews objectAtIndex:0];
  1096. contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height - self.tabBarController.tabBar.frame.size.height);
  1097. self.tabBarController.tabBar.hidden = NO;
  1098. });
  1099. }
  1100. - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
  1101. {
  1102. __block NSString *resultString = nil;
  1103. __block BOOL finished = NO;
  1104. [self.webView evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
  1105. if (error == nil) {
  1106. if (result != nil) {
  1107. resultString = [NSString stringWithFormat:@"%@", result];
  1108. }
  1109. } else {
  1110. NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
  1111. }
  1112. finished = YES;
  1113. }];
  1114. while (!finished) {
  1115. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
  1116. }
  1117. return resultString;
  1118. }
  1119. -(void)hiddenMethodTabBar
  1120. {
  1121. kMainQueue(^{
  1122. if (iPhoneX) {
  1123. if (@available(iOS 11.0, *)) {
  1124. self.webView.frame = CGRectMake(0, 0, WIDTH, HEIGHT);
  1125. }
  1126. }else {
  1127. self.webView.frame = CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT+STATUS_BAR_HEIGHT);
  1128. }
  1129. });
  1130. }
  1131. -(void)showMethodTabBar
  1132. {
  1133. kMainQueue(^{
  1134. if (iPhoneX) {
  1135. if (@available(iOS 11.0, *)) {
  1136. self.webView.frame = CGRectMake(0, 0, WIDTH, HEIGHT-TAB_BAR_HEIGHT);
  1137. }
  1138. }else {
  1139. self.webView.frame = CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT-TAB_BAR_HEIGHT+STATUS_BAR_HEIGHT);
  1140. }
  1141. });
  1142. }
  1143. //取消获取照片
  1144. - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
  1145. {
  1146. dispatch_async(dispatch_get_main_queue(), ^{
  1147. [picker dismissViewControllerAnimated:YES completion:^{
  1148. [self uploadUrl:@""];
  1149. }];
  1150. });
  1151. }
  1152. //上传图片
  1153. -(void)uploadPic:(NSData *)data
  1154. {
  1155. NSString *isPath = @"courseFile";
  1156. if (![[GlobalData shareInstance].isSkipPath isEqualToString:@""]) {
  1157. isPath = [GlobalData shareInstance].isSkipPath;
  1158. }
  1159. NSDictionary * body = @{@"type":isPath};
  1160. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  1161. //ContentType设置
  1162. manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"image/jpeg",@"image/png",@"application/octet-stream",@"text/json",@"text/plain",nil];
  1163. manager.responseSerializer= [AFHTTPResponseSerializer serializer];
  1164. manager.requestSerializer = [AFHTTPRequestSerializer serializer];
  1165. manager.requestSerializer.timeoutInterval = 15.0f;
  1166. [manager POST:[NSString stringWithFormat:@"%@jyapp/filemanage/upload",kHost] parameters:body constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  1167. //上传的参数(上传图片,以文件流的格式)
  1168. [formData appendPartWithFileData:data
  1169. name:isPath
  1170. fileName:[isPath stringByAppendingFormat:@".jpeg"]
  1171. mimeType:@"image/jpeg"];
  1172. } progress:^(NSProgress * _Nonnull uploadProgress) {
  1173. CGFloat progress = 100.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
  1174. NSLog(@"%.2lf%%", progress);
  1175. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  1176. //请求成功的block回调
  1177. NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
  1178. NSLog(@"上传成功%@",dic);
  1179. if ([dic[@"msg"] isEqualToString:@"ssss"]) {
  1180. [self uploadUrl:dic[@"url"]];
  1181. }else{
  1182. [self uploadUrl:@""];
  1183. }
  1184. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  1185. NSLog(@"上传失败%@",error);
  1186. [self uploadUrl:@""];
  1187. }];
  1188. }
  1189. -(void)uploadUrl:(NSString *)url {
  1190. NSString *textJS = [NSString new];
  1191. NSString *methodJS = [NSString new];
  1192. if ([url isEqualToString:@""]) {
  1193. textJS = @"hiddenLoading()";
  1194. methodJS =@"hiddenLoading";
  1195. }else{
  1196. textJS = [NSString stringWithFormat:@"uploadImg('%@')",url];
  1197. methodJS = @"uploadImg";
  1198. }
  1199. if ([url isEqualToString:@""]||[textJS isEqualToString:@""]) {
  1200. NSLog(@"空的情况");
  1201. textJS = @"hiddenLoading()";
  1202. methodJS = @"hiddenLoading";
  1203. }
  1204. NSDictionary *dict = @{@"jsStr":textJS,@"name":methodJS};
  1205. [self performSelector:@selector(uploadJS:) withObject:dict afterDelay:1];
  1206. }
  1207. //获取到图片
  1208. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
  1209. {
  1210. dispatch_async(dispatch_get_main_queue(), ^{
  1211. [picker dismissViewControllerAnimated:YES completion:^{
  1212. UIImage * img=[info objectForKey:UIImagePickerControllerEditedImage];
  1213. NSData *data = UIImageJPEGRepresentation(img, 0.5);
  1214. if (data!=nil) {
  1215. [self uploadPic:data];
  1216. }else{
  1217. NSLog(@"data == nil");
  1218. [self uploadUrl:@""];
  1219. }
  1220. }];
  1221. });
  1222. }
  1223. -(void)uploadJS:(NSDictionary *)dict {
  1224. [self isExitCallToJS:dict[@"jsStr"] withMethodName:dict[@"name"]];
  1225. }
  1226. -(NSString *)convertToJsonData:(NSDictionary *)dict {
  1227. NSError *error;
  1228. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
  1229. NSString *jsonString;
  1230. if (!jsonData) {
  1231. NSLog(@"%@",error);
  1232. }else{
  1233. jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
  1234. }
  1235. NSMutableString *mutStr = [NSMutableString stringWithString:jsonString];
  1236. NSRange range = {0,jsonString.length};
  1237. //去掉字符串中的空格
  1238. [mutStr replaceOccurrencesOfString:@" " withString:@"" options:NSLiteralSearch range:range];
  1239. NSRange range2 = {0,mutStr.length};
  1240. //去掉字符串中的换行符
  1241. [mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2];
  1242. return mutStr;
  1243. }
  1244. -(void)addNoNetViews{
  1245. kMainQueue(^{
  1246. self.recognizer.enabled = NO;
  1247. [self removeNoNetViews];
  1248. //about:blank
  1249. self.noNetView = [NoNetView shareView];
  1250. [self.view addSubview:self.noNetView];
  1251. });
  1252. }
  1253. -(void)removeNoNetViews{
  1254. if (self.noNetView ) {
  1255. self.recognizer.enabled = YES;
  1256. [self.noNetView removeFromSuperview];
  1257. self.noNetView = nil;
  1258. }
  1259. }
  1260. -(void)addFailNetViews{
  1261. kMainQueue(^{
  1262. self.recognizer.enabled = NO;
  1263. [self removeFailNetViews];
  1264. self.failNetView = [NoNetView shareView];
  1265. [self.view addSubview:self.failNetView];
  1266. });
  1267. }
  1268. -(void)removeFailNetViews{
  1269. if (self.failNetView ) {
  1270. self.recognizer.enabled = YES;
  1271. [self.failNetView removeFromSuperview];
  1272. self.failNetView = nil;
  1273. }
  1274. }
  1275. #pragma mark **** 通知相关方法
  1276. -(void)openPushUrlOtherMethods:(NSNotification *)notification{
  1277. if(self.tabBarController.selectedIndex == 3) {
  1278. NSDictionary *infoDict = notification.userInfo;
  1279. NSLog(@"%@",infoDict);
  1280. if (!infoDict) {return;}
  1281. NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"url"]];
  1282. if ([urlStr isEqualToString:kHost]) {return;}
  1283. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]]];
  1284. }
  1285. }
  1286. -(void)openPushUrlMethodsFour:(NSNotification *)notification{
  1287. NSDictionary *infoDict = notification.userInfo;
  1288. NSLog(@"%@",infoDict);
  1289. if (!infoDict) {return;}
  1290. NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"url"]];
  1291. if ([urlStr isEqualToString:kHost]||![LXUserDefaults token]) {return;}
  1292. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlStr]]];
  1293. }
  1294. -(void)openPushLinkUrlMethods:(NSNotification *)notification{
  1295. NSDictionary *infoDict = notification.userInfo;
  1296. NSLog(@"%@",infoDict);
  1297. if (!infoDict) {return;}
  1298. NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"url"]];
  1299. if ([urlStr isEqualToString:kHost]) {return;}
  1300. if (self.tabBarController.selectedIndex == 3) {
  1301. [self JsOpenExternalLink:@{@"url":urlStr,@"title":@"消息通知"}];
  1302. }
  1303. }
  1304. -(void)alipayWXpayStatus:(NSNotification *)notification{
  1305. if(self.tabBarController.selectedIndex == 3) {
  1306. NSString * status = [notification object];
  1307. [self performSelector:@selector(payStatus:) withObject:status afterDelay:2];
  1308. }
  1309. }
  1310. -(void)payStatus:(NSString *)status
  1311. {
  1312. NSLog(@"支付状态:%@",status);//目前延时两秒
  1313. if(self.tabBarController.selectedIndex == 3) {
  1314. [self isExitCallToJS:[NSString stringWithFormat:@"payCallBack('%@')", status] withMethodName:@"payCallBack"];
  1315. }
  1316. }
  1317. // 再次加载页面
  1318. -(void)notNetReloadWebVIew:(NSNotification *)notification{
  1319. if(self.tabBarController.selectedIndex == 3) {
  1320. if (![self.webView canGoBack]) {
  1321. [self webViewFirstRequest];
  1322. }else{
  1323. [self.webView reload];
  1324. }
  1325. }
  1326. }
  1327. // 返回上一页面- 防止
  1328. -(void)popWebView:(NSNotification *)notification{
  1329. if(self.tabBarController.selectedIndex == 3) {
  1330. if ([self.webView canGoBack]) {
  1331. [self.webView goBack];
  1332. }
  1333. [self removeNoNetViews];
  1334. [self removeFailNetViews];
  1335. }
  1336. }
  1337. // 收到退出登录消息
  1338. -(void)loginOut:(NSNotification *)notification{
  1339. if([notification.userInfo[@"item_index"] integerValue]!=3) {
  1340. return;
  1341. }
  1342. NSString *url = [NSString stringWithFormat:@"%@%@", kHost, @"jyapp/free/login?back=index&isios=t&flag=kicked"];
  1343. url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  1344. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
  1345. }
  1346. // 监控网络状态变化
  1347. -(void)netReachChanged:(NSNotification *)notificaition{
  1348. NSDictionary *userInfo = notificaition.userInfo;
  1349. if ([userInfo[@"AFNetworkingReachabilityNotificationStatusItem"] intValue] == 0 || [userInfo[@"AFNetworkingReachabilityNotificationStatusItem"] intValue] == -1) {
  1350. [self addNoNetViews];
  1351. }else{
  1352. [self removeNoNetViews];
  1353. if (isExistNoNewWork) {
  1354. isExistNoNewWork = NO;
  1355. [self notNetReloadWebVIew:nil];
  1356. }
  1357. }
  1358. }
  1359. -(void)jyReceiveNewsRedPoint:(NSNotification *)notificaition {
  1360. NSDictionary *dict = notificaition.userInfo;
  1361. if(self.tabBarController.selectedIndex == 3) {
  1362. NSString *textJS = [NSString stringWithFormat:@"afterReceivePushMessage('%@','%@')",dict[@"typeMsg"],dict[@"url"]];
  1363. [self isExitCallToJS:textJS withMethodName:@"afterReceivePushMessage"];
  1364. }
  1365. }
  1366. -(void)jyRefreshMenusView:(NSNotification *)notificaition {
  1367. NSDictionary *dict = notificaition.userInfo;
  1368. NSString *name = [NSString stringWithFormat:@"%@",dict[@"name"]];
  1369. NSString *type = [NSString stringWithFormat:@"%@",dict[@"type"]];
  1370. if ([name isEqualToString:@"me"]) {
  1371. if ([type isEqualToString:@"0"]) {
  1372. [self.webView reload];
  1373. }else {
  1374. [self webViewFirstRequest];
  1375. }
  1376. }
  1377. }
  1378. //刷新页面相关
  1379. -(void)refreshNonCurVC:(NSNotification *)notificaition{
  1380. if(self.tabBarController.selectedIndex != 3) {
  1381. [self webViewFirstRequest];
  1382. }
  1383. }
  1384. -(void)refreshAllVC:(NSNotification *)notificaition{
  1385. [self webViewFirstRequest];
  1386. }
  1387. -(void)refreshExpAndMine:(NSNotification *)notificaition{
  1388. [self webViewFirstRequest];
  1389. }
  1390. //内购相关
  1391. -(void)receiptData:(NSNotification *)notificaition{
  1392. if(self.tabBarController.selectedIndex == 3) {
  1393. NSDictionary *infoDict = notificaition.userInfo;
  1394. if (infoDict) {
  1395. NSString *receipt = [NSString stringWithFormat:@"%@", infoDict[@"receipt"]];
  1396. [self isExitCallToJS:[NSString stringWithFormat:@"getReceipt('%@')", receipt] withMethodName:@"getReceipt"];
  1397. }
  1398. }
  1399. }
  1400. #pragma mark ****粘贴板相关-梳理
  1401. -(void)updateClipboard:(NSNotification *)notificaition{
  1402. if(self.tabBarController.selectedIndex == 3) {
  1403. NSString *current_url = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
  1404. NSDictionary *dict = notificaition.userInfo;
  1405. NSString *content = [NSString stringWithFormat:@"%@",dict[@"content"]];
  1406. if ([current_url containsString:@"jyapp/free/login"]) {
  1407. [GlobalData shareInstance].isPasteLogin = YES;
  1408. }else {
  1409. [self popPasteVIew:content];
  1410. }
  1411. }
  1412. }
  1413. -(void)openTheClipboard:(NSNotification *)notificaition{
  1414. if(self.tabBarController.selectedIndex == 3) {
  1415. NSLog(@"菜单四打开指定粘贴板url");
  1416. NSDictionary *dict = notificaition.userInfo;
  1417. NSString *tmpUrl = [NSString stringWithFormat:@"%@%@", kHost, dict[@"url"]];
  1418. tmpUrl = [tmpUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  1419. kMainQueue(^{
  1420. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:tmpUrl]]];
  1421. })
  1422. }
  1423. }
  1424. //弹出粘贴板框
  1425. -(void)popPasteVIew:(NSString *)content {
  1426. [[LXNetworkManager shareLXNetworkManager]postWithURLStr:[NSString stringWithFormat:@"%@distribution/share/getWordInfo",kHost] parameters:@{@"copyTxt":content} progress:^(NSProgress *progress) {
  1427. NSLog(@"%@",progress);
  1428. } success:^(id responseObject) {
  1429. NSLog(@"responseObject=%@",responseObject);
  1430. if ([responseObject objectForKey:@"data"]) {
  1431. NSDictionary *dict = [[NSDictionary alloc]initWithDictionary:responseObject[@"data"]];
  1432. if ([dict objectForKey:@"title"]) {
  1433. self.clipboardView.title =dict[@"title"];
  1434. self.clipboardView.subTitle =dict[@"subTitle"];
  1435. self.clipboardView.imgUrl =dict[@"imgUrl"];
  1436. self.clipboardView.appUrl =dict[@"appUrl"];
  1437. self.clipboardView.butTxt =dict[@"butTxt"];
  1438. self.clipboardView.bottomTxt =dict[@"bottomTxt"];
  1439. [self.clipboardView show];
  1440. }
  1441. }
  1442. } failure:^(NSError *error) {
  1443. NSLog(@"error=%@",error);
  1444. }];
  1445. }
  1446. #pragma mark **** 代理方法
  1447. -(void)clipboardClick:(NSString *)url {
  1448. //发送通知打开粘贴板-url
  1449. [[NSNotificationCenter defaultCenter] postNotificationName:OpenTheClipboard object:nil userInfo:@{@"url":url}];
  1450. }
  1451. /*
  1452. #pragma mark - Navigation
  1453. // In a storyboard-based application, you will often want to do a little preparation before navigation
  1454. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  1455. // Get the new view controller using [segue destinationViewController].
  1456. // Pass the selected object to the new view controller.
  1457. }
  1458. */
  1459. @end