JYNewExpViewController.m 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225
  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 "JYNewExpViewController.h"
  9. #import <WebKit/WebKit.h>
  10. #import "JYTabBarController.h"
  11. #import <CoreLocation/CoreLocation.h>
  12. @interface JYNewExpViewController ()<WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler,CLLocationManagerDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
  13. {
  14. BOOL refreshTabBool;
  15. CGPoint startTouch;
  16. BOOL _isMoving;
  17. }
  18. @property (nonatomic, strong) UIProgressView *progressView;
  19. @property (nonatomic, strong) WKWebView *webView;
  20. @property(nonatomic, assign)BOOL updateNotify;
  21. @property(nonatomic, strong)NoNetView *noNetView;
  22. @end
  23. NSString *const new_kInitVector_3 = @"1389461544135476";
  24. size_t const new_kKeySize_3 = kCCKeySizeAES128;
  25. NSString *const new_AesKey_3 = @"mGlAgnIBB8bx2nch";
  26. @implementation JYNewExpViewController
  27. -(void)viewWillAppear:(BOOL)animated
  28. {
  29. [super viewWillAppear:animated];
  30. [self.navigationController setNavigationBarHidden:YES animated:animated];
  31. }
  32. //进度条
  33. - (UIProgressView *)progressView
  34. {
  35. if (_progressView == nil) {
  36. _progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0,STATUS_BAR_HEIGHT - 2,WIDTH,2)];
  37. _progressView.tintColor = [UIColor blueColor];
  38. _progressView.trackTintColor = [UIColor whiteColor];
  39. }
  40. return _progressView;
  41. }
  42. //懒加载
  43. - (WKWebView *)webView
  44. {
  45. if(_webView == nil) {
  46. WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
  47. config.preferences = [[WKPreferences alloc] init];
  48. config.preferences.minimumFontSize = 0;
  49. config.preferences.javaScriptEnabled = YES;
  50. config.preferences.javaScriptCanOpenWindowsAutomatically = YES;
  51. //添加消息处理,注意:self指代的是需要遵守WKScriptMessageHandler协议,结束时需要移除
  52. config.userContentController = [[WKUserContentController alloc] init];
  53. //声明协议
  54. NSArray *jsArr = @[@"loginByWeixin",
  55. @"share",
  56. @"saveUserToken",
  57. @"removeUserToken",
  58. @"openSystemNotification",
  59. @"openExternalLink",
  60. @"alert",
  61. @"hiddenBottom",
  62. @"checkLab",
  63. @"loginSuccess",
  64. @"backUrl",
  65. @"clearPushMessage",
  66. @"hideRedSpotOnMenu",
  67. @"showRedSpotOnMenu",
  68. @"wxPay",
  69. @"aliPay",
  70. @"skipCamera",
  71. @"skipAlbum",
  72. @"appTest",
  73. ];
  74. for (NSString*jsName in jsArr) {
  75. [config.userContentController addScriptMessageHandler:self name:jsName];
  76. }
  77. //高端的自定义配置创建WKWebView
  78. if (iPhoneX) {
  79. _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT-TAB_BAR_HEIGHT) configuration:config];
  80. if (@available(iOS 11.0, *)) {
  81. _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  82. }
  83. }else {
  84. _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT-TAB_BAR_HEIGHT+STATUS_BAR_HEIGHT) configuration:config];
  85. }
  86. _webView.scrollView.bounces = NO;
  87. _webView.UIDelegate = self;
  88. _webView.navigationDelegate = self;
  89. // _webView.allowsBackForwardNavigationGestures = true;
  90. [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
  91. }
  92. return _webView;
  93. }
  94. -(void)webViewFirstRequest
  95. {
  96. NSString *url = [NSString stringWithFormat:@"%@%@", kHost, @"jyapp/jylab/index"];
  97. url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  98. NSLog(@"333 :第一次加载:%@",url);
  99. kMainQueue(^{
  100. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
  101. })
  102. }
  103. #pragma mark - event response
  104. // 计算wkWebView进度条
  105. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  106. if (object == self.webView && [keyPath isEqualToString:@"estimatedProgress"]) {
  107. CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
  108. self.progressView.alpha = 1.0f;
  109. [self.progressView setProgress:newprogress animated:YES];
  110. if (newprogress >= 1.0f) {
  111. [UIView animateWithDuration:0.3f
  112. delay:0.3f
  113. options:UIViewAnimationOptionCurveEaseOut
  114. animations:^{
  115. self.progressView.alpha = 0.0f;
  116. }
  117. completion:^(BOOL finished) {
  118. [self.progressView setProgress:0 animated:NO];
  119. }];
  120. }
  121. } else {
  122. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  123. }
  124. }
  125. -(void)initNotification {
  126. //加载通知
  127. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestWebView:) name:kRequestWebViewWithUrl object:nil];
  128. //点击订阅通知
  129. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickSubNotiMethods:) name:ClickSubNotiMethods object:nil];
  130. //点击支付通知
  131. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickPayMethods:) name:ClickPayMethods object:nil];
  132. //支付状态通知
  133. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(alipayWXpayStatus:) name:AlipayWXpayStatus object:nil];
  134. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateNotifyState) name:kUpdateNotifyState object:nil];
  135. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(afterReceiveNewMsg) name:kAfterReceiveNewMsg object:nil];
  136. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadWebView) name:kReloadWebVIew object:nil];
  137. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginOut:) name:kLoginOut object:nil];
  138. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
  139. //展示底部红的通知
  140. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsRedPoint:) name:JYNewsRedPoint object:nil];
  141. //接收全新通知
  142. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshNonCurVC:) name:RefreshNonCurVC object:nil];
  143. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshAllVC:) name:RefreshAllVC object:nil];
  144. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshExpAndMine:) name:RefreshExpAndMine object:nil];
  145. }
  146. #pragma mark – Gesture Recognizer –
  147. -(void)paningGestureReceive:(UIPanGestureRecognizer *)recoginzer
  148. {
  149. NSString *current_url = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
  150. NSLog(@"当前页面:%@",current_url);
  151. CGRect rect = self.view.bounds;
  152. CGFloat width = CGRectGetWidth(rect);
  153. if (![self.webView canGoBack]) {
  154. NSLog(@"不可返回");
  155. return;
  156. }
  157. if([current_url containsString:@"jyapp/free/login"]) {
  158. return;
  159. }
  160. // NSString *current_url = self.webView.request.URL.absoluteString;
  161. 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]]){
  162. return;
  163. }
  164. CGPoint touchPoint = [recoginzer locationInView:[UIApplication sharedApplication].keyWindow];
  165. if (recoginzer.state==UIGestureRecognizerStateBegan) {
  166. _isMoving = YES;
  167. startTouch = touchPoint;
  168. } else if (recoginzer.state==UIGestureRecognizerStateEnded){
  169. if (touchPoint.x - startTouch.x > width*0.125) {
  170. [UIView animateWithDuration:0.3 animations:^{
  171. [self moveViewWithX:width];
  172. // [GlobalData shareInstance].isSideslip = YES;
  173. [self.webView goBack];
  174. } completion:^(BOOL finished) {
  175. _isMoving = NO;
  176. [self moveViewWithX:0];
  177. }];
  178. } else {
  179. [UIView animateWithDuration:0.3 animations:^{
  180. [self moveViewWithX:0];
  181. } completion:^(BOOL finished) {
  182. _isMoving = NO;
  183. }];
  184. }
  185. return;
  186. } else if (recoginzer.state==UIGestureRecognizerStateCancelled){
  187. [UIView animateWithDuration:0.3 animations:^{
  188. [self moveViewWithX:0];
  189. } completion:^(BOOL finished) {
  190. _isMoving = NO;
  191. }];
  192. return;
  193. }
  194. if (_isMoving) {
  195. [self moveViewWithX:touchPoint.x - startTouch.x];
  196. }
  197. }
  198. -(void)moveViewWithX:(float)x
  199. {
  200. CGRect rect = self.view.bounds;
  201. CGFloat width = CGRectGetWidth(rect);
  202. x = x>width?width:x;
  203. x = x<0?0:x;
  204. CGRect frame = self.webView.frame;
  205. frame.origin.x = x;
  206. self.webView.frame = frame;
  207. }
  208. - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
  209. // message.body -- Allowed types are NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull.
  210. // NSLog(@"原生收到了js发送过来的消息message.name = %@ message.body = %@",message.name,message.body);
  211. if ([message.name isEqualToString:@"loginByWeixin"]) {
  212. [self jsLoginByWeixin:message.body];
  213. }else if ([message.name isEqualToString:@"share"]) {
  214. [self jsShare:message.body];
  215. }else if ([message.name isEqualToString:@"saveUserToken"]) {
  216. [self jsSaveUserToken:message.body];
  217. }else if ([message.name isEqualToString:@"removeUserToken"]) {
  218. [self jsRemoveUserToken:message.body];
  219. }else if ([message.name isEqualToString:@"openSystemNotification"]) {
  220. [self jsOpenSystemNotification:message.body];
  221. }else if ([message.name isEqualToString:@"openExternalLink"]) {
  222. [self JsOpenExternalLink:message.body];
  223. }else if ([message.name isEqualToString:@"alert"]) {
  224. [self jsAlert:message.body];
  225. }else if ([message.name isEqualToString:@"hiddenBottom"]) {
  226. [self jsHiddenBottom:message.body];
  227. }else if ([message.name isEqualToString:@"checkLab"]) {
  228. [self jsCheckLab:message.body];
  229. }else if ([message.name isEqualToString:@"loginSuccess"]) {
  230. [self jsLoginSuccess:message.body];
  231. }else if ([message.name isEqualToString:@"backUrl"]) {
  232. [self jsBackUrl:message.body];
  233. }else if ([message.name isEqualToString:@"clearPushMessage"]) {
  234. [self jsClearPushMessage:message.body];
  235. }else if ([message.name isEqualToString:@"hideRedSpotOnMenu"]) {
  236. [self jsHideRedSpotOnMenu:message.body];
  237. }else if ([message.name isEqualToString:@"showRedSpotOnMenu"]) {
  238. [self jsShowRedSpotOnMenu:message.body];
  239. }else if ([message.name isEqualToString:@"wxPay"]) {
  240. [self jsWxPay:message.body];
  241. }else if ([message.name isEqualToString:@"aliPay"]) {
  242. [self jsAliPay:message.body];
  243. }else if ([message.name isEqualToString:@"skipCamera"]) {
  244. [self jsSkipCamera:message.body];
  245. }else if ([message.name isEqualToString:@"skipAlbum"]) {
  246. [self jsSkipAlbum:message.body];
  247. }else {
  248. }
  249. }
  250. #pragma mark - WKUIDelegate
  251. - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler
  252. {
  253. NSError *err = nil;
  254. NSData *dataFromString = [prompt dataUsingEncoding:NSUTF8StringEncoding];
  255. NSDictionary *paramdict = [NSJSONSerialization JSONObjectWithData:dataFromString options:NSJSONReadingMutableContainers error:&err];
  256. if (!err){
  257. NSString *type = [paramdict objectForKey:@"jsName"];
  258. if (type && [type isEqualToString:@"getUserToken"]) {
  259. NSDictionary *dict = @{@"type":@"string",
  260. @"value":[self jsGetUserToken:paramdict]};
  261. completionHandler([self convertToJsonData:dict]);
  262. }else if (type && [type isEqualToString:@"getVersion"]) {
  263. NSDictionary *dict = @{@"type":@"string",
  264. @"value":[self jsGetVersion:paramdict]};
  265. completionHandler([self convertToJsonData:dict]);
  266. }else if (type && [type isEqualToString:@"checkNoticePermission"]) {
  267. NSDictionary *dict = @{@"type":@"int",
  268. @"value":[NSString stringWithFormat:@"%d",[self jsCheckNoticePermission:paramdict]]};
  269. completionHandler([self convertToJsonData:dict]);
  270. }else if (type && [type isEqualToString:@"getPushRid"]) {
  271. NSDictionary *dict = @{@"type":@"string",@"value":[self jsGetPushRid:paramdict]};
  272. completionHandler([self convertToJsonData:dict]);
  273. }else if (type && [type isEqualToString:@"isInstallWeixin"]) {
  274. NSDictionary *dict = @{@"type":@"int",
  275. @"value":[NSString stringWithFormat:@"%d",[self jsIsInstallWeixin:paramdict]]};
  276. completionHandler([self convertToJsonData:dict]);
  277. }else if (type && [type isEqualToString:@"getCipherText"]) {
  278. NSDictionary *dict = @{@"type":@"string",
  279. @"value":[self jsGetCipherText:paramdict]};
  280. completionHandler([self convertToJsonData:dict]);
  281. }
  282. else if (type && [type isEqualToString:@"getOtherPushRid"]) {
  283. NSDictionary *dict = @{@"type":@"string",@"value":[self jsGetOtherPushRid:paramdict]};
  284. completionHandler([self convertToJsonData:dict]);
  285. }else if (type && [type isEqualToString:@"getPhoneBrand"]) {
  286. NSDictionary *dict = @{@"type":@"string",
  287. @"value":[self jsGetPhoneBrand:paramdict]};
  288. completionHandler([self convertToJsonData:dict]);
  289. }else {
  290. completionHandler(@"");
  291. }
  292. }
  293. }
  294. //通过js alert 显示一个警告面板,调用原生会走此方法。
  295. - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
  296. {
  297. NSLog(@"显示一个JavaScript警告面板, message = %@",message);
  298. UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"温馨提示" message:message preferredStyle:UIAlertControllerStyleAlert];
  299. [alertController addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  300. completionHandler();
  301. }]];
  302. [self presentViewController:alertController animated:YES completion:nil];
  303. }
  304. //通过 js confirm 显示一个确认面板,调用原生会走此方法。
  305. - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler
  306. {
  307. NSLog(@"运行JavaScript确认面板, message = %@", message);
  308. UIAlertController *action = [UIAlertController alertControllerWithTitle:@"温馨提示" message:message preferredStyle:UIAlertControllerStyleAlert];
  309. [action addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
  310. completionHandler(NO);
  311. }] ];
  312. [action addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  313. completionHandler(YES);
  314. }]];
  315. [self presentViewController:action animated:YES completion:nil];
  316. }
  317. #pragma mark - OC调JS交互
  318. -(void)isExitCallToJS:(NSString *)jsStr withMethodName:(NSString *)name{
  319. NSString *jsName = [NSString stringWithFormat:@"function exist(){return !window['%@']};exist()",name];
  320. [_webView evaluateJavaScript:jsName completionHandler:^(id _Nullable result, NSError * _Nullable error) {
  321. NSLog(@"是否存在 result:%@,error:%@",result,error);
  322. if ([result intValue]==0) {
  323. [self executeCallJS:jsStr];
  324. }else {
  325. NSLog(@"不存在-不存在-不存在-%@",jsStr);
  326. }
  327. }];
  328. }
  329. -(void)executeCallJS:(NSString *)jsStr {
  330. NSLog(@"OC调JS交互%@:",jsStr);
  331. [_webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
  332. if (error!=nil) {
  333. NSLog(@"result:%@,error:%@",result,error);
  334. [[LXViewControllerManager shareViewControllerManager]showAlertViewWithMessage: jsStr];
  335. [[GlobalData shareInstance] addOnePlistData:@{
  336. @"detail":[[self stringByEvaluatingJavaScriptFromString:@"document.location.href"] stringByAppendingString:[NSString stringWithFormat:@"\nJS异常方法:%@\n%@",jsStr,[error description]]],
  337. @"reqTime":[NSNumber numberWithInt:0],
  338. }];
  339. }
  340. }];
  341. }
  342. - (void)viewDidLoad {
  343. [super viewDidLoad];
  344. // Do any additional setup after loading the view.
  345. NSLog(@"百宝箱初始化");
  346. self.view.backgroundColor = [UIColor whiteColor];
  347. [self.view addSubview:self.webView];
  348. [self.view addSubview:self.progressView];
  349. [self webViewFirstRequest];
  350. [[AFNetworkReachabilityManager sharedManager] startMonitoring];
  351. [self initNotification];
  352. UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(paningGestureReceive:)];
  353. [recognizer delaysTouchesBegan];
  354. [self.view addGestureRecognizer:recognizer];
  355. }
  356. #pragma mark - WKNavigationDelegate
  357. /* 页面加载完成 */
  358. - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
  359. NSString *curUrl = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
  360. NSLog(@"-----页面加载完成%@",curUrl);
  361. if(refreshTabBool){
  362. NSLog(@"刷新-刷新-刷新-刷新-")
  363. refreshTabBool = NO;
  364. }else {
  365. //正常的网页加载
  366. [self judgeIsHidden];//是否隐藏
  367. }
  368. // if ([GlobalData shareInstance].isSideslip) {
  369. // [GlobalData shareInstance].isSideslip = YES;
  370. // [self isExitCallToJS:@"afterClickBack()" withMethodName:@"afterClickBack"];
  371. // }
  372. [self removeNoNetViews];
  373. [[LXViewControllerManager shareViewControllerManager] hideHud];
  374. [self performSelector:@selector(afterPageClick) withObject:nil afterDelay:2];
  375. }
  376. -(void)afterPageClick {
  377. [self isExitCallToJS:@"afterPageInit()" withMethodName:@"afterPageInit"];
  378. }
  379. // 页面开始加载时调用
  380. - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
  381. }
  382. // 当内容开始返回时调用
  383. - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
  384. }
  385. // 页面加载失败时调用
  386. - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(nonnull NSError *)error{
  387. [[GlobalData shareInstance] addOnePlistData:@{
  388. @"detail":[[self stringByEvaluatingJavaScriptFromString:@"document.location.href"] stringByAppendingString:[NSString stringWithFormat:@"\n%@",[error description]]],
  389. @"reqTime":[NSNumber numberWithInt:0],
  390. }];
  391. }
  392. #pragma mark *****JS与OC交互
  393. #pragma mark - WKScriptMessageHandler JS调OC交互
  394. -(void)jsLoginByWeixin:(NSDictionary *)dict {
  395. if ([LXUserDefaults isInstallWeiXin] != 1) { // 没有安装微信 不走友盟
  396. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"微信登录失败,没有安装微信" delay:1.5];
  397. return;
  398. }
  399. [[UMSocialManager defaultManager] getUserInfoWithPlatform:UMSocialPlatformType_WechatSession currentViewController:self completion:^(id result, NSError *error) {
  400. UMSocialUserInfoResponse *resp = result;
  401. [self dealWXDic:(NSDictionary *)resp.originalResponse];
  402. [[LXViewControllerManager shareViewControllerManager] hideHud];
  403. }];
  404. }
  405. // 处理微信登录获取到的数据
  406. -(void)dealWXDic:(NSDictionary *)dictionary{
  407. [[LXViewControllerManager shareViewControllerManager] showHudText:nil];
  408. //如果获取到用户信息,即用户点击了“登录”,则进行用户信息获取
  409. if (dictionary.count > 0) {
  410. NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:dictionary];
  411. if (dic) {
  412. [dic removeObjectForKey:@"privilege"];
  413. [dic removeObjectForKey:@"language"];
  414. double currDouble = [[NSDate date] timeIntervalSince1970];
  415. [dic setObject:[NSNumber numberWithLong:(long)currDouble] forKey:@"createtime"];
  416. // 拼接标志位
  417. 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"]];
  418. sign = [LXMD5 md532BitLower:sign];
  419. [dic setObject:sign forKey:@"sign"];
  420. NSString *endStr = [[LXViewControllerManager shareViewControllerManager] getJsonStr:dic];
  421. NSData *data = [endStr dataUsingEncoding:NSUTF8StringEncoding];
  422. endStr = [data base64EncodedStringWithOptions:0];
  423. [self isExitCallToJS:[NSString stringWithFormat:@"loginByWeixinCallBack('%@')", endStr] withMethodName:@"loginByWeixinCallBack"];
  424. }
  425. }
  426. }
  427. -(void)jsShare:(NSDictionary *)dict {
  428. NSString *type = [NSString stringWithFormat:@"%@",dict[@"type"]];
  429. NSString *title = [NSString stringWithFormat:@"%@",dict[@"title"]];
  430. NSString *content = [NSString stringWithFormat:@"%@",dict[@"content"]];
  431. NSString *link = [NSString stringWithFormat:@"%@",dict[@"link"]];
  432. UMSocialPlatformType shareType;
  433. if ([type intValue] == 1) { // 微信好友
  434. shareType = UMSocialPlatformType_WechatSession;
  435. }else if ([type intValue] == 2){ /// qq好友
  436. shareType = UMSocialPlatformType_QQ;
  437. }else if ([type intValue] == 3){ // 朋友圈
  438. shareType = UMSocialPlatformType_WechatTimeLine;
  439. }else{
  440. shareType = UMSocialPlatformType_WechatSession;
  441. }
  442. if ([type intValue] == 1 || [type intValue] == 3) {
  443. if ([LXUserDefaults isInstallWeiXin] != 1) {
  444. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"没有安装微信" delay:1.5];
  445. return;
  446. }
  447. }
  448. if ([type intValue] == 2) {
  449. if (![[UMSocialManager defaultManager] isInstall:UMSocialPlatformType_QQ]) {
  450. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"没有安装QQ" delay:1.5];
  451. return;
  452. }
  453. }
  454. //创建分享消息对象
  455. UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
  456. //创建网页内容对象
  457. UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:content thumImage:[UIImage imageNamed:@"logo"]];
  458. //设置网页地址
  459. shareObject.webpageUrl = link;
  460. messageObject.shareObject = shareObject;
  461. //调用分享接口
  462. [[UMSocialManager defaultManager] shareToPlatform:shareType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
  463. if (error) {
  464. if (error.userInfo[@"message"] && [error.userInfo[@"message"] containsString:@"Operation is cancel"]) {
  465. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"取消分享" delay:1];
  466. }else{
  467. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:error.userInfo[@"message"] delay:1];
  468. }
  469. [self isExitCallToJS:[NSString stringWithFormat:@"shareCallBack('%@','%@')",type,@"0"] withMethodName:@"shareCallBack"];
  470. }else{
  471. if ([data isKindOfClass:[UMSocialShareResponse class]]) {
  472. [self isExitCallToJS:[NSString stringWithFormat:@"shareCallBack('%@','%@')",type,@"1"] withMethodName:@"shareCallBack"];
  473. }else{
  474. UMSocialLogInfo(@"response data is %@",data);
  475. }
  476. }
  477. }];
  478. }
  479. -(void)jsSaveUserToken:(NSDictionary *)dict{
  480. [[LXViewControllerManager shareViewControllerManager] hideHud];
  481. [LXUserDefaults saveToken:[NSString stringWithFormat:@"%@",dict[@"token"]]];
  482. }
  483. -(NSString *)jsGetUserToken:(NSDictionary *)dict{
  484. return [LXUserDefaults token];
  485. }
  486. -(void)jsRemoveUserToken:(NSDictionary *)dict{
  487. [LXUserDefaults clearAll];
  488. }
  489. -(int)jsCheckNoticePermission:(NSDictionary *)dict{
  490. return [LXUserDefaults notifyState];
  491. }
  492. // 跳转到系统设置
  493. -(void)jsOpenSystemNotification:(NSDictionary *)dict{
  494. self.updateNotify = YES;
  495. [[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
  496. }
  497. // 获取推送id
  498. -(NSString *)jsGetPushRid:(NSDictionary *)dict{
  499. return [LXUserDefaults registrationID];
  500. }
  501. // 打开新页面 加载新web
  502. -(void)JsOpenExternalLink:(NSDictionary *)dict{
  503. NSString *url = [NSString stringWithFormat:@"%@",dict[@"url"]];
  504. NSString *title = [NSString stringWithFormat:@"%@",dict[@"title"]];
  505. if (url) {
  506. if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable || [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusUnknown) {
  507. }
  508. NewWebController *ctr = [[NewWebController alloc] init];
  509. ctr.url = url;
  510. if (!title || [title isEqualToString:@""] || [title isEqualToString:@"undefined"]) {
  511. ctr.titleShow = nil;
  512. }else{
  513. ctr.titleShow = title;
  514. }
  515. kMainQueue(^{
  516. [self presentViewController:ctr animated:NO completion:nil];
  517. });
  518. }
  519. }
  520. // 获取当前版本号
  521. -(NSString *)jsGetVersion:(NSDictionary *)dict{
  522. return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  523. }
  524. -(void)jsAlert:(NSDictionary *)dict{
  525. [[LXViewControllerManager shareViewControllerManager] showAlertViewWithMessage:[NSString stringWithFormat:@"%@",dict[@"content"]]];
  526. }
  527. -(int)jsIsInstallWeixin:(NSDictionary *)dict{
  528. return [LXUserDefaults isInstallWeiXin];
  529. }
  530. -(NSString *)jsGetCipherText:(NSDictionary *)dict{
  531. NSDictionary *objDict = [NSDictionary dictionaryWithDictionary:dict[@"arguments"]];
  532. NSString *phone = [NSString stringWithFormat:@"%@",objDict[@"phone"]];
  533. NSDate *date=[NSDate date];
  534. NSDateFormatter *format1=[[NSDateFormatter alloc] init];
  535. [format1 setDateFormat:@"yyyyMMddhhmmss"];
  536. NSString *dateStr;
  537. dateStr=[format1 stringFromDate:date];
  538. NSLog(@"%@",dateStr);
  539. NSString *content = [[NSString stringWithFormat:@"%@_%@",phone,dateStr] stringByAppendingString:[NSString stringWithFormat:@"_%@",[LXMD5 md532BitLower:[NSString stringWithFormat:@"%@&%@",phone,dateStr]]]];
  540. NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
  541. NSUInteger dataLength = contentData.length;
  542. // 为结束符'\\0' +1
  543. char keyPtr[new_kKeySize_3 + 1];
  544. memset(keyPtr, 0, sizeof(keyPtr));
  545. [new_AesKey_3 getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  546. // 密文长度 <= 明文长度 + BlockSize
  547. size_t encryptSize = dataLength + kCCBlockSizeAES128;
  548. void *encryptedBytes = malloc(encryptSize);
  549. size_t actualOutSize = 0;
  550. NSData *initVector = [new_kInitVector_3 dataUsingEncoding:NSUTF8StringEncoding];
  551. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  552. kCCAlgorithmAES,
  553. kCCOptionPKCS7Padding, // 系统默认使用 CBC,然后指明使用 PKCS7Padding
  554. keyPtr,
  555. new_kKeySize_3,
  556. initVector.bytes,
  557. contentData.bytes,
  558. dataLength,
  559. encryptedBytes,
  560. encryptSize,
  561. &actualOutSize);
  562. if (cryptStatus == kCCSuccess) {
  563. // 对加密后的数据进行 base64 编码
  564. return [[NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
  565. }
  566. free(encryptedBytes);
  567. return nil;
  568. }
  569. -(void)jsHiddenBottom:(NSDictionary *)dict{
  570. if(self.tabBarController.selectedIndex == 2) {
  571. if([[NSString stringWithFormat:@"%@",dict[@"hidden"]] integerValue]==0) {
  572. [self hideTabBar];
  573. [self hiddenMethodTabBar];
  574. }else {
  575. [self showTabBar];
  576. [self showMethodTabBar];
  577. }
  578. }
  579. }
  580. -(void)jsCheckLab:(NSDictionary *)dict {
  581. [[NSNotificationCenter defaultCenter] postNotificationName:RefreshNonCurVC object:nil userInfo:nil];
  582. }
  583. //js方法登录成功
  584. -(void)jsLoginSuccess:(NSDictionary *)dict {
  585. NSLog(@"exp登录成功提示");
  586. NSString *status = [NSString stringWithFormat:@"%@",dict[@"status"]];
  587. [GlobalData shareInstance].isReLogin = YES;
  588. if([status isEqualToString:@"S"]) {
  589. kMainQueue(^{
  590. [[NSNotificationCenter defaultCenter] postNotificationName:RefreshAllVC object:nil userInfo:nil];
  591. AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  592. JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController;
  593. tab.selectedIndex = 0;
  594. });
  595. }else {
  596. }
  597. }
  598. -(void)jsBackUrl:(NSDictionary *)dict {
  599. NSString *status = [NSString stringWithFormat:@"%@",dict[@"status"]];
  600. NSLog(@"exp返回");
  601. if([status isEqualToString:@"H"]) {
  602. //测试返回首页
  603. kMainQueue(^{
  604. [[NSNotificationCenter defaultCenter] postNotificationName:RefreshAllVC object:nil userInfo:nil];
  605. AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  606. JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController;
  607. tab.selectedIndex = 0;
  608. });
  609. }
  610. }
  611. -(void)jsClearPushMessage:(NSDictionary *)dict {
  612. kMainQueue(^{
  613. [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
  614. [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
  615. });
  616. }
  617. -(void)jsHideRedSpotOnMenu:(NSDictionary *)dict {
  618. NSString *menu = [NSString stringWithFormat:@"%@",dict[@"menu"]];
  619. if([menu isEqualToString:@"subscribe"]) {
  620. kMainQueue(^{
  621. [self.tabBarController.tabBar hideBadgeOnItemIndex:1];
  622. });
  623. }
  624. if([menu isEqualToString:@"my"]) {
  625. kMainQueue(^{
  626. [self.tabBarController.tabBar hideBadgeOnItemIndex:3];
  627. });
  628. }
  629. }
  630. -(void)jsShowRedSpotOnMenu:(NSDictionary *)dict {
  631. NSString *menu = [NSString stringWithFormat:@"%@",dict[@"menu"]];
  632. if([menu isEqualToString:@"subscribe"]) {
  633. kMainQueue(^{
  634. [self.tabBarController.tabBar showBadgeOnItemIndex:1];
  635. });
  636. }
  637. if([menu isEqualToString:@"my"]) {
  638. kMainQueue(^{
  639. [self.tabBarController.tabBar showBadgeOnItemIndex:3];
  640. });
  641. }
  642. }
  643. -(void)jsWxPay:(NSDictionary *)dict {
  644. NSString *jsonString = [NSString stringWithFormat:@"%@",dict[@"order"]];
  645. if ([LXUserDefaults isInstallWeiXin] != 1) { // 没有安装wx
  646. [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"请先安装微信再进行支付!" delay:1.5];
  647. return;
  648. }
  649. NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  650. NSError *err;
  651. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
  652. if(err) {
  653. NSLog(@"json解析失败:%@",err);
  654. return;
  655. }
  656. //吊起微信
  657. PayReq *request = [[PayReq alloc] init] ;
  658. request.openID = dic[@"Appid"];
  659. request.partnerId = dic[@"Partnerid"];
  660. request.prepayId= dic[@"Prepayid"];
  661. request.package = @"Sign=WXPay";
  662. request.nonceStr= dic[@"Noncestr"];
  663. request.timeStamp= [dic[@"Timestamp"] intValue];
  664. request.sign= dic[@"Sign"];
  665. kMainQueue(^{
  666. [WXApi sendReq:request];
  667. });
  668. }
  669. -(void)jsAliPay:(NSDictionary *)dict {
  670. NSString *order = [NSString stringWithFormat:@"%@",dict[@"order"]];
  671. kMainQueue(^{
  672. [[AlipaySDK defaultService] payOrder:order fromScheme:@"jianyuiosapp" callback:nil];
  673. });
  674. }
  675. -(NSString *)jsGetOtherPushRid:(NSDictionary *)dict {
  676. return [LXUserDefaults deviceToken];
  677. }
  678. -(NSString *)jsGetPhoneBrand:(NSDictionary *)dict {
  679. UIDevice *device = [UIDevice currentDevice];
  680. return device.platformString;
  681. }
  682. //拍照上传图片
  683. -(void)jsSkipCamera:(NSDictionary *)dict {
  684. UIImagePickerController *picker = [[UIImagePickerController alloc] init];
  685. picker.delegate = self;
  686. picker.allowsEditing = YES;
  687. picker.sourceType = UIImagePickerControllerSourceTypeCamera;
  688. dispatch_async(dispatch_get_main_queue(), ^{
  689. [self presentViewController:picker animated:YES completion:nil];
  690. });
  691. }
  692. //相册选择照片
  693. -(void)jsSkipAlbum:(NSDictionary *)dict {
  694. UIImagePickerController *picker = [[UIImagePickerController alloc] init];
  695. picker.delegate = self;
  696. picker.allowsEditing = YES;
  697. picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  698. dispatch_async(dispatch_get_main_queue(), ^{
  699. [self presentViewController:picker animated:YES completion:nil];
  700. });
  701. }
  702. // web是否可退回上页面
  703. -(int)jsIsCanBack:(NSString *)str{
  704. return self.webView.canGoBack ? 1:0;
  705. }
  706. #pragma mark *****其他方法
  707. -(void)judgeIsHidden {
  708. NSString *current_url = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"];
  709. NSLog(@"判断需要隐藏否:%@",current_url);
  710. if([current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/jylab/index",kHost]]
  711. ||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/free/login?back=index",kHost]]){
  712. NSLog(@"需要展示");
  713. [self showTabBar];
  714. [self showMethodTabBar];
  715. }else {
  716. NSLog(@"需要隐藏");
  717. [self hideTabBar];
  718. [self hiddenMethodTabBar];
  719. }
  720. }
  721. -(void)pushDY:(NSDictionary *)infoDict
  722. {
  723. [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshDY" object:nil userInfo:infoDict];
  724. }
  725. -(void)requestWebTime:(NSDictionary *)infoDict
  726. {
  727. NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"info"][@"url"]];
  728. if([infoDict[@"type"] isEqualToString:@"message"]) {
  729. NSString *url = [NSString stringWithFormat:@"%@",urlStr];
  730. NSArray * array = [url componentsSeparatedByString:@"=="];
  731. url = [array.firstObject stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  732. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
  733. }else if ([infoDict[@"type"] isEqualToString:@"titleMessage"]) {
  734. NSArray * array = [urlStr componentsSeparatedByString:@"=="];
  735. urlStr = [array.firstObject stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  736. NSString * titleStr = @"消息通知";
  737. titleStr = [NSString stringWithFormat:@"%@",infoDict[@"info"][@"title"]];
  738. if (urlStr&&self.tabBarController.selectedIndex == 2) {
  739. [self JsOpenExternalLink:@{@"url":urlStr,@"title":titleStr}];
  740. }
  741. }else {
  742. NSString *url = [NSString stringWithFormat:@"%@%@", kHost, urlStr];
  743. url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  744. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
  745. }
  746. }
  747. - (void)hideTabBar {
  748. kMainQueue(^{
  749. if (self.tabBarController.tabBar.hidden == YES) {
  750. return;
  751. }
  752. UIView *contentView;
  753. if ( [[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] )
  754. contentView = [self.tabBarController.view.subviews objectAtIndex:1];
  755. else
  756. contentView = [self.tabBarController.view.subviews objectAtIndex:0];
  757. 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);
  758. self.tabBarController.tabBar.hidden = YES;
  759. });
  760. }
  761. - (void)showTabBar{
  762. kMainQueue(^{
  763. if (self.tabBarController.tabBar.hidden == NO)
  764. {
  765. return;
  766. }
  767. UIView *contentView;
  768. if ([[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]])
  769. contentView = [self.tabBarController.view.subviews objectAtIndex:1];
  770. else
  771. contentView = [self.tabBarController.view.subviews objectAtIndex:0];
  772. 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);
  773. self.tabBarController.tabBar.hidden = NO;
  774. });
  775. }
  776. - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
  777. {
  778. __block NSString *resultString = nil;
  779. __block BOOL finished = NO;
  780. [self.webView evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
  781. if (error == nil) {
  782. if (result != nil) {
  783. resultString = [NSString stringWithFormat:@"%@", result];
  784. }
  785. } else {
  786. NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
  787. }
  788. finished = YES;
  789. }];
  790. while (!finished) {
  791. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
  792. }
  793. return resultString;
  794. }
  795. -(void)hiddenMethodTabBar
  796. {
  797. kMainQueue(^{
  798. if (iPhoneX) {
  799. if (@available(iOS 11.0, *)) {
  800. self.webView.frame = CGRectMake(0, 0, WIDTH, HEIGHT);
  801. NSLog(@"%@",self.webView)
  802. }
  803. }else {
  804. self.webView.frame = CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT+STATUS_BAR_HEIGHT);
  805. }
  806. });
  807. }
  808. -(void)showMethodTabBar
  809. {
  810. kMainQueue(^{
  811. if (iPhoneX) {
  812. if (@available(iOS 11.0, *)) {
  813. self.webView.frame = CGRectMake(0, 0, WIDTH, HEIGHT-TAB_BAR_HEIGHT);
  814. }
  815. }else {
  816. self.webView.frame = CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT-TAB_BAR_HEIGHT+STATUS_BAR_HEIGHT);
  817. }
  818. });
  819. }
  820. //取消获取照片
  821. - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
  822. {
  823. dispatch_async(dispatch_get_main_queue(), ^{
  824. [picker dismissViewControllerAnimated:YES completion:^{
  825. [self uploadUrl:@""];
  826. }];
  827. });
  828. }
  829. //上传图片
  830. -(void)uploadPic:(NSData *)data
  831. {
  832. NSDictionary * body = @{@"type":@"courseFile"};
  833. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  834. //ContentType设置
  835. manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"image/jpeg",@"image/png",@"application/octet-stream",@"text/json",@"text/plain",nil];
  836. manager.responseSerializer= [AFHTTPResponseSerializer serializer];
  837. manager.requestSerializer = [AFHTTPRequestSerializer serializer];
  838. manager.requestSerializer.timeoutInterval = 15.0f;
  839. [manager POST:[NSString stringWithFormat:@"%@filemanage/upload",kHost] parameters:body constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
  840. //上传的参数(上传图片,以文件流的格式)
  841. [formData appendPartWithFileData:data
  842. name:@"courseFile"
  843. fileName:@"courseFile.jpeg"
  844. mimeType:@"image/jpeg"];
  845. } progress:^(NSProgress * _Nonnull uploadProgress) {
  846. CGFloat progress = 100.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
  847. NSLog(@"%.2lf%%", progress);
  848. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  849. //请求成功的block回调
  850. NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
  851. NSLog(@"上传成功%@",dic);
  852. if ([dic[@"msg"] isEqualToString:@"ssss"]) {
  853. [self uploadUrl:dic[@"url"]];
  854. }else{
  855. [self uploadUrl:@""];
  856. }
  857. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  858. NSLog(@"上传失败%@",error);
  859. [self uploadUrl:@""];
  860. [[GlobalData shareInstance] addOnePlistData:@{
  861. @"detail":@"上传图片接口",
  862. @"reqTime":[NSNumber numberWithInt:0],
  863. }];
  864. }];
  865. }
  866. -(void)uploadUrl:(NSString *)url {
  867. NSString *textJS = [NSString new];
  868. NSString *methodJS = [NSString new];
  869. if ([url isEqualToString:@""]) {
  870. textJS = @"hiddenLoading()";
  871. methodJS =@"hiddenLoading";
  872. }else{
  873. textJS = [NSString stringWithFormat:@"uploadImg('%@')",url];
  874. methodJS = @"uploadImg";
  875. }
  876. if ([url isEqualToString:@""]||[textJS isEqualToString:@""]) {
  877. NSLog(@"空的情况");
  878. textJS = @"hiddenLoading()";
  879. methodJS = @"hiddenLoading";
  880. }
  881. NSDictionary *dict = @{@"jsStr":textJS,@"name":methodJS};
  882. [self performSelector:@selector(uploadJS:) withObject:dict afterDelay:1];
  883. }
  884. //获取到图片
  885. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
  886. {
  887. dispatch_async(dispatch_get_main_queue(), ^{
  888. [picker dismissViewControllerAnimated:YES completion:^{
  889. UIImage * img=[info objectForKey:UIImagePickerControllerEditedImage];
  890. NSData *data = UIImageJPEGRepresentation(img, 0.5);
  891. if (data!=nil) {
  892. [self uploadPic:data];
  893. }else{
  894. NSLog(@"data == nil");
  895. [self uploadUrl:@""];
  896. }
  897. }];
  898. });
  899. }
  900. -(void)uploadJS:(NSDictionary *)dict {
  901. [self isExitCallToJS:dict[@"jsStr"] withMethodName:dict[@"name"]];
  902. }
  903. - (BOOL)checkLocationServiceIsEnabled{
  904. // 该方法是类方法,和我们创建的管理器没有关系
  905. if ([CLLocationManager locationServicesEnabled]) {
  906. return YES;
  907. }
  908. return NO;
  909. }
  910. -(NSString *)convertToJsonData:(NSDictionary *)dict {
  911. NSError *error;
  912. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
  913. NSString *jsonString;
  914. if (!jsonData) {
  915. NSLog(@"%@",error);
  916. }else{
  917. jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
  918. }
  919. NSMutableString *mutStr = [NSMutableString stringWithString:jsonString];
  920. NSRange range = {0,jsonString.length};
  921. //去掉字符串中的空格
  922. [mutStr replaceOccurrencesOfString:@" " withString:@"" options:NSLiteralSearch range:range];
  923. NSRange range2 = {0,mutStr.length};
  924. //去掉字符串中的换行符
  925. [mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2];
  926. return mutStr;
  927. }
  928. -(void)addNoNetViews{
  929. kMainQueue(^{
  930. [self removeNoNetViews];
  931. self.noNetView = [NoNetView shareView];
  932. [self.view addSubview:self.noNetView];
  933. });
  934. }
  935. -(void)removeNoNetViews{
  936. if (self.noNetView ) {
  937. [self.noNetView removeFromSuperview];
  938. self.noNetView = nil;
  939. }
  940. }
  941. #pragma mark **** 通知相关方法
  942. // 点击通知 跳转到通知内url
  943. -(void)requestWebView:(NSNotification *)notification{
  944. NSDictionary * infoDict = [notification object];
  945. if (!infoDict) {
  946. return;
  947. }
  948. NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"info"][@"url"]];
  949. if (urlStr) {
  950. //当前控制器
  951. if(self.tabBarController.selectedIndex != 2) {
  952. return;
  953. }
  954. [[LXViewControllerManager shareViewControllerManager] showHudText:nil];
  955. [self performSelector:@selector(requestWebTime:) withObject:infoDict afterDelay:1];
  956. }
  957. }
  958. -(void)clickSubNotiMethods:(NSNotification *)notification{
  959. NSDictionary * infoDict = [notification object][@"info"];
  960. if (!infoDict) {
  961. return;
  962. }
  963. NSLog(@"%@",infoDict);
  964. NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"url"]];
  965. if (urlStr) {
  966. NSLog(@"有info");
  967. if(self.tabBarController.selectedIndex == 2) {
  968. //底部栏置换到订阅
  969. AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  970. JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController;
  971. tab.selectedIndex = 1;
  972. [self performSelector:@selector(pushDY:) withObject:infoDict afterDelay:1];
  973. }
  974. }
  975. }
  976. //点击支付通知
  977. -(void)clickPayMethods:(NSNotification *)notification{
  978. NSDictionary * infoDict = [notification object][@"info"];
  979. if (!infoDict) {
  980. return;
  981. }
  982. NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"url"]];
  983. NSArray * array = [urlStr componentsSeparatedByString:@"=="];
  984. urlStr = [array.firstObject stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  985. NSString * titleStr = @"消息通知";
  986. titleStr = [NSString stringWithFormat:@"%@",infoDict[@"title"]];
  987. if (urlStr) {
  988. if(self.tabBarController.selectedIndex == 2) {
  989. [self JsOpenExternalLink:@{@"url":urlStr,@"title":titleStr}];
  990. }
  991. }
  992. }
  993. -(void)alipayWXpayStatus:(NSNotification *)notification{
  994. NSString * status = [notification object];
  995. [self performSelector:@selector(payStatus:) withObject:status afterDelay:2];
  996. }
  997. -(void)payStatus:(NSString *)status
  998. {
  999. //目前延时两秒
  1000. NSLog(@"支付状态:%@",status);
  1001. if(self.tabBarController.selectedIndex == 2) {
  1002. [self isExitCallToJS:[NSString stringWithFormat:@"payCallBack('%@')", status] withMethodName:@"payCallBack"];
  1003. }
  1004. }
  1005. // 调用js方法 刷新推送权限状态
  1006. -(void)updateNotifyState{
  1007. if (self.updateNotify) {
  1008. self.updateNotify = NO;
  1009. [self isExitCallToJS:[NSString stringWithFormat:@"updateNoticeSwitch()"] withMethodName:@"updateNoticeSwitch"];
  1010. }
  1011. }
  1012. // 收到通知消息
  1013. -(void)afterReceiveNewMsg{
  1014. NSLog(@"afterReceiveNewMsg");
  1015. [self isExitCallToJS:@"afterReceiveNewMsg()" withMethodName:@"afterReceiveNewMsg"];
  1016. }
  1017. // 再次加载页面
  1018. -(void)reloadWebView{
  1019. if(self.tabBarController.selectedIndex == 2) {
  1020. [[LXViewControllerManager shareViewControllerManager] showHudText:nil];
  1021. if (!self.webView.canGoBack) {
  1022. [self webViewFirstRequest];
  1023. }else{
  1024. [self.webView reload];
  1025. }
  1026. }
  1027. }
  1028. // 收到退出登录消息
  1029. -(void)loginOut:(NSNotification *)notification{
  1030. if([notification.userInfo[@"item_index"] integerValue]!=2) {
  1031. return;
  1032. }
  1033. [self webViewRequestByMsg];
  1034. }
  1035. //收到消息退出并重新加载web
  1036. -(void)webViewRequestByMsg{
  1037. NSString *url = [NSString stringWithFormat:@"%@%@", kHost, @"jyapp/free/login?back=index&isios=t&flag=kicked"];
  1038. url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
  1039. [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
  1040. }
  1041. // 监控网络状态变化
  1042. -(void)netReachChanged:(NSNotification *)notificaition{
  1043. NSDictionary *userInfo = notificaition.userInfo;
  1044. if ([userInfo[@"AFNetworkingReachabilityNotificationStatusItem"] intValue] == 0 || [userInfo[@"AFNetworkingReachabilityNotificationStatusItem"] intValue] == -1) {
  1045. [self addNoNetViews];
  1046. }else{
  1047. [self removeNoNetViews];
  1048. }
  1049. }
  1050. -(void)newsRedPoint:(NSNotification *)notificaition
  1051. {
  1052. NSDictionary *dict = notificaition.userInfo;
  1053. if(self.tabBarController.selectedIndex == 2) {
  1054. NSString *textJS = [NSString stringWithFormat:@"afterReceivePushMessage('%@','%@')",dict[@"typeMsg"],dict[@"url"]];
  1055. [self isExitCallToJS:textJS withMethodName:@"afterReceivePushMessage"];
  1056. }
  1057. }
  1058. //刷新页面相关
  1059. -(void)refreshNonCurVC:(NSNotification *)notificaition{
  1060. if(self.tabBarController.selectedIndex != 2) {
  1061. refreshTabBool = YES;
  1062. [self webViewFirstRequest];
  1063. }
  1064. }
  1065. -(void)refreshAllVC:(NSNotification *)notificaition{
  1066. [self webViewFirstRequest];
  1067. }
  1068. -(void)refreshExpAndMine:(NSNotification *)notificaition{
  1069. refreshTabBool = YES;
  1070. [self webViewFirstRequest];
  1071. }
  1072. -(void)clearWeb{
  1073. NSURLCache * cache = [NSURLCache sharedURLCache];
  1074. [cache removeAllCachedResponses];
  1075. [cache setDiskCapacity:0];
  1076. [cache setMemoryCapacity:0];
  1077. }
  1078. /*
  1079. #pragma mark - Navigation
  1080. // In a storyboard-based application, you will often want to do a little preparation before navigation
  1081. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  1082. // Get the new view controller using [segue destinationViewController].
  1083. // Pass the selected object to the new view controller.
  1084. }
  1085. */
  1086. @end