BGBaseWebViewController.m 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. //
  2. // BGBaseWebViewController.m
  3. // BuguLive
  4. //
  5. // Created by xfg on 2017/6/3.
  6. // Copyright © 2017年 xfg. All rights reserved.
  7. //
  8. #import "BGBaseWebViewController.h"
  9. @interface BGBaseWebViewController ()
  10. {
  11. NSTimeInterval _beginTime;
  12. }
  13. @property (nonatomic, assign) BOOL isFirstLoad; // 是否第一次加载
  14. @property (nonatomic, strong) UIBarButtonItem *rightBarBtnItem;
  15. @property (nonatomic, strong) UIImageView *launchImgView; // h5框架中,加载h5网页时用来遮盖当前页面,防止加载过程中的空白过程,等页面加载完后再隐藏
  16. @end
  17. @implementation BGBaseWebViewController
  18. + (void)initialize
  19. {
  20. // NSString *sdk_guid = [[UIDevice currentDevice] uniqueGlobalDeviceIdentifier];
  21. // NSString *userAgent = [[[uwebview alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
  22. // NSString *customUserAgent = [userAgent stringByAppendingFormat:[NSString stringWithFormat:@" fanwe_app_sdk sdk_type/ios sdk_version_name/%@ sdk_version/%@ sdk_guid/%@ kScreenW/%@ kScreenH/%@",VersionNum,VersionTime,sdk_guid,[NSString stringWithFormat:@"%f",kScaleW],[NSString stringWithFormat:@"%f",kScaleH]],nil];
  23. // [[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];
  24. // WKWebView *wkwebView = [WKWebView new];
  25. // NSURL *url = [NSURL URLWithString:@"h5Url"];
  26. // NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy                                         timeoutInterval:2.f];
  27. // [wkwebView loadRequest:request];
  28. // [wkwebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
  29. // //1)获取默认userAgent:
  30. // NSString *oldUA = result; //直接获取为nil
  31. // //2)设置userAgent:添加额外的信息
  32. // NSString *newUA = [NSString stringWithFormat:@"%@ crfapp/(%@)", oldUA , @"ios;43"];
  33. // NSDictionary *dictNU = [NSDictionary dictionaryWithObjectsAndKeys:newUA, @"UserAgent", nil];
  34. // [[NSUserDefaults standardUserDefaults] registerDefaults:dictNU];
  35. // }];
  36. }
  37. /**
  38. 类方法初始1
  39. @param urlStr WebView加载地址
  40. @return 返回WKWebView
  41. */
  42. + (instancetype)webControlerWithUrlStr:(NSString *)urlStr
  43. {
  44. BGBaseWebViewController *tmpControl = [[self alloc]init];
  45. tmpControl.urlStr = urlStr;
  46. return tmpControl;
  47. }
  48. /**
  49. 类方法初始2
  50. @param urlStr urlStr WebView加载地址
  51. @param isShowIndicator 是否显示指示器
  52. @return 返回WKWebView
  53. */
  54. + (instancetype)webControlerWithUrlStr:(NSString *)urlStr isShowIndicator:(BOOL)isShowIndicator
  55. {
  56. BGBaseWebViewController *tmpControl = [[self alloc]init];
  57. tmpControl.urlStr = urlStr;
  58. tmpControl.isShowIndicator = isShowIndicator;
  59. return tmpControl;
  60. }
  61. /**
  62. 类方法初始3
  63. @param urlStr urlStr WebView加载地址
  64. @param isShowIndicator 是否显示指示器
  65. @param isShowNavBar 是否显示导航栏
  66. @return 返回WKWebView
  67. */
  68. + (instancetype)webControlerWithUrlStr:(NSString *)urlStr isShowIndicator:(BOOL)isShowIndicator isShowNavBar:(BOOL)isShowNavBar
  69. {
  70. BGBaseWebViewController *tmpControl = [[self alloc]init];
  71. tmpControl.urlStr = urlStr;
  72. tmpControl.isShowIndicator = isShowIndicator;
  73. tmpControl.isShowNavBar = isShowNavBar;
  74. return tmpControl;
  75. }
  76. /**
  77. 类方法初始4
  78. @param urlStr urlStr WebView加载地址
  79. @param isShowIndicator 是否显示指示器
  80. @param isShowNavBar 是否显示导航栏
  81. @param isShowTabBar 是否显示tabBar
  82. @return 返回WKWebView
  83. */
  84. + (instancetype)webControlerWithUrlStr:(NSString *)urlStr isShowIndicator:(BOOL)isShowIndicator isShowNavBar:(BOOL)isShowNavBar isShowTabBar:(BOOL)isShowTabBar
  85. {
  86. BGBaseWebViewController *tmpControl = [[self alloc]init];
  87. tmpControl.urlStr = urlStr;
  88. tmpControl.isShowIndicator = isShowIndicator;
  89. tmpControl.isShowNavBar = isShowNavBar;
  90. tmpControl.isShowTabBar = isShowTabBar;
  91. return tmpControl;
  92. }
  93. /**
  94. 类方法初始5
  95. @param urlStr WebView加载地址
  96. @param isShowIndicator 是否显示指示器
  97. @param isShowNavBar 是否显示导航栏
  98. @param isShowBackBtn 是否显示返回按钮
  99. @return 返回WKWebView
  100. */
  101. + (instancetype)webControlerWithUrlStr:(NSString *)urlStr isShowIndicator:(BOOL)isShowIndicator isShowNavBar:(BOOL)isShowNavBar isShowBackBtn:(BOOL)isShowBackBtn
  102. {
  103. BGBaseWebViewController *tmpControl = [[self alloc]init];
  104. tmpControl.urlStr = urlStr;
  105. tmpControl.isShowIndicator = isShowIndicator;
  106. tmpControl.isShowNavBar = isShowNavBar;
  107. tmpControl.isShowBackBtn = isShowBackBtn;
  108. return tmpControl;
  109. }
  110. /**
  111. 类方法初始5
  112. @param urlStr WebView加载地址
  113. @param isShowIndicator 是否显示指示器
  114. @param isShowNavBar 是否显示导航栏
  115. @param isShowBackBtn 是否显示返回按钮
  116. @param isShowCloseBtn 是否显示关闭按钮(前提是 isShowBackBtn==YES)
  117. @return 返回WKWebView
  118. */
  119. + (instancetype)webControlerWithUrlStr:(NSString *)urlStr isShowIndicator:(BOOL)isShowIndicator isShowNavBar:(BOOL)isShowNavBar isShowBackBtn:(BOOL)isShowBackBtn isShowCloseBtn:(BOOL)isShowCloseBtn
  120. {
  121. BGBaseWebViewController *tmpControl = [[self alloc]init];
  122. tmpControl.urlStr = urlStr;
  123. tmpControl.isShowIndicator = isShowIndicator;
  124. tmpControl.isShowNavBar = isShowNavBar;
  125. tmpControl.isShowBackBtn = isShowBackBtn;
  126. tmpControl.isShowCloseBtn = isShowCloseBtn;
  127. return tmpControl;
  128. }
  129. - (BOOL)prefersStatusBarHidden
  130. {
  131. return NO;
  132. }
  133. - (void)viewDidLoad
  134. {
  135. [super viewDidLoad];
  136. self.isShowSegHead = NO;
  137. }
  138. - (void)viewWillAppear:(BOOL)animated
  139. {
  140. [super viewWillAppear:animated];
  141. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  142. if (!_isShowNavBar)
  143. {
  144. [self.navigationController setNavigationBarHidden:YES animated:YES];
  145. }
  146. else
  147. {
  148. [self.navigationController setNavigationBarHidden:NO animated:YES];
  149. }
  150. if (_isViewWillAppearRefresh)
  151. {
  152. [self reLoadCurrentWKWebView];
  153. }
  154. // 指定边缘要延伸的方向,该属性很重要
  155. self.edgesForExtendedLayout = UIRectEdgeNone;
  156. }
  157. - (void)viewWillDisappear:(BOOL)animated
  158. {
  159. [super viewWillDisappear:animated];
  160. [self.navigationController setNavigationBarHidden:NO animated:YES];
  161. [self hideMyHud];
  162. }
  163. #pragma mark UI创建
  164. - (void)initFWUI
  165. {
  166. [super initFWUI];
  167. if (![BGUtils isBlankString:_navTitleStr])
  168. {
  169. self.navigationItem.title = _navTitleStr;
  170. }
  171. [self statusBarCurrentBackgroundColor];
  172. // 获取cookie
  173. NSString *cookieStr = @"document.cookie = ";
  174. NSString *cookieStr2 = @"";
  175. NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:kMyCookies];
  176. if([cookiesdata length])
  177. {
  178. NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata];
  179. NSHTTPCookie *cookie;
  180. for (cookie in cookies)
  181. {
  182. if (![BGUtils isBlankString:cookie.name] && ![BGUtils isBlankString:cookie.value])
  183. {
  184. [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
  185. cookieStr = [cookieStr stringByAppendingString:[NSString stringWithFormat:@"'%@=%@';", [cookie name],[cookie value]]];
  186. cookieStr2 = [cookieStr2 stringByAppendingString:[NSString stringWithFormat:@"%@=%@;", [cookie name],[cookie value]]];
  187. }
  188. }
  189. }
  190. if (_userContentC)
  191. {
  192. WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
  193. WKUserScript * cookieScript;
  194. if ([cookiesdata length])
  195. {
  196. cookieScript = [[WKUserScript alloc] initWithSource: cookieStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
  197. }
  198. else
  199. {
  200. cookieScript = [[WKUserScript alloc] initWithSource:@"window.webkit.messageHandlers.updateCookies.postMessage(document.cookie);" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
  201. }
  202. [_userContentC addUserScript:cookieScript];
  203. configuration.userContentController = _userContentC;
  204. self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
  205. }
  206. else
  207. {
  208. self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
  209. }
  210. [self.view addSubview:self.webView];
  211. if (!_isShouldOpenBounces)
  212. {
  213. self.webView.scrollView.bounces = NO;
  214. }
  215. self.webView.scrollView.showsHorizontalScrollIndicator = NO;
  216. self.webView.scrollView.showsVerticalScrollIndicator = NO;
  217. self.webView.navigationDelegate = self;
  218. self.webView.UIDelegate = self;
  219. [self adjustWebViewFrame];
  220. if (_isShowBackBtn && _isShowCloseBtn)
  221. { // 显示返回、关闭按钮
  222. UIBarButtonItem *buttonItem1 = [UIBarButtonItem itemWithTarget:self action:@selector(webViewReturnBtnPress) image:@"com_arrow_vc_back" highImage:@"com_arrow_vc_back"];
  223. UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; // 该UIBarButtonItem只是用来控制间距的
  224. spaceItem.width = 5;
  225. UIBarButtonItem *buttonItem2 = [[UIBarButtonItem alloc] initWithTitle:ASLocalizedString(@"关闭")style:UIBarButtonItemStylePlain target:self action:@selector(webViewCloseBtnPress)];
  226. buttonItem2.tintColor = kAppMainColor;
  227. self.navigationItem.leftBarButtonItems = @[buttonItem1,spaceItem,buttonItem2];
  228. }
  229. else if (_isShowBackBtn)
  230. { // 显示关闭按钮
  231. self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(webViewReturnBtnPress) image:@"com_arrow_vc_back" highImage:@"com_arrow_vc_back"];
  232. }
  233. [self initLaunchImgView];
  234. }
  235. #pragma mark h5框架中,加载h5网页时用来遮盖当前页面,防止加载过程中的空白过程,等页面加载完后再隐藏
  236. - (void)initLaunchImgView
  237. {
  238. if (_isShowLaunchImgView)
  239. {
  240. _launchImgView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
  241. [_launchImgView setImage:[UIImage imageNamed:@"wel"]];
  242. [self.view addSubview:_launchImgView];
  243. }
  244. }
  245. #pragma mark 移除LaunchImgView
  246. - (void)removeLaunchImgView
  247. {
  248. if (_launchImgView)
  249. {
  250. [_launchImgView removeFromSuperview];
  251. }
  252. }
  253. #pragma mark 设置当前状态栏的背景色
  254. - (void)statusBarCurrentBackgroundColor
  255. {
  256. if (![BGUtils isBlankString:self.BuguLive.appModel.statusbar_color])
  257. {
  258. NSMutableString *statusbar_color = [NSMutableString stringWithString:self.BuguLive.appModel.statusbar_color];
  259. if ([statusbar_color hasPrefix:@"#"])
  260. {
  261. [statusbar_color deleteCharactersInRange:NSMakeRange(0,1)];
  262. }
  263. unsigned int hexValue = 0;
  264. NSScanner *scanner = [NSScanner scannerWithString:statusbar_color];
  265. [scanner setScanLocation:0]; // depends on your exact string format you may have to use location 1
  266. [scanner scanHexInt:&hexValue];
  267. self.view.backgroundColor = RGBOF(hexValue);
  268. }
  269. else
  270. {
  271. self.view.backgroundColor = kAppMainColor;
  272. }
  273. self.view.backgroundColor = kWhiteColor;
  274. }
  275. #pragma mark 调整webview的frame
  276. - (void)adjustWebViewFrame
  277. {
  278. if (!_isShowNavBar)
  279. {
  280. self.webView.y = 20;
  281. }
  282. if (!_isShowTabBar && !_isShowNavBar)
  283. {
  284. self.webView.height = kScreenH-kStatusBarHeight;
  285. }
  286. else if (_isShowTabBar && _isShowNavBar)
  287. {
  288. self.webView.height = kScreenH-kStatusBarHeight-64-kTabBarHeight;
  289. }
  290. else
  291. {
  292. if(!_isShowTabBar)
  293. {
  294. self.webView.height = kScreenH-kStatusBarHeight-44;
  295. }
  296. if(!_isShowNavBar)
  297. {
  298. self.webView.height = kScreenH-kStatusBarHeight-kTabBarHeight;
  299. }
  300. }
  301. if (self.isShowSegHead) {
  302. self.webView.height = kScreenH-kStatusBarHeight - 64 -44-kTabBarHeight-44;
  303. }
  304. }
  305. - (void)reLoadWebViewAndHideRightBarBtnItem
  306. {
  307. [self reLoadCurrentWKWebView];
  308. if (_rightBarBtnItem)
  309. {
  310. _rightBarBtnItem = nil;
  311. self.navigationItem.rightBarButtonItem = nil;
  312. }
  313. }
  314. #pragma mark 添加导航栏右侧按钮
  315. - (void)initRightBarBtnItemWithType:(RightBarBtnItem)type titleStr:(NSString *)titleStr
  316. {
  317. if (_rightBarBtnItem)
  318. {
  319. _rightBarBtnItem = nil;
  320. }
  321. if (type == RightBarBtnItemRefresh)
  322. {
  323. _rightBarBtnItem = [[UIBarButtonItem alloc] initWithTitle:titleStr style:UIBarButtonItemStylePlain target:self action:@selector(reLoadWebViewAndHideRightBarBtnItem)];
  324. [_rightBarBtnItem setTitleTextAttributes:@{NSForegroundColorAttributeName:kAppGrayColor1} forState:UIControlStateNormal];
  325. self.navigationItem.rightBarButtonItem = _rightBarBtnItem;
  326. }
  327. }
  328. #pragma mark 初始化变量
  329. - (void)initFWVariables
  330. {
  331. [super initFWVariables];
  332. }
  333. #pragma mark 加载数据
  334. - (void)initFWData
  335. {
  336. [super initFWData];
  337. if (_isFrontRefresh)
  338. {
  339. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reLoadCurrentWKWebView) name:UIApplicationWillEnterForegroundNotification object:nil];
  340. }
  341. [self loadCurrentWKWebView];
  342. }
  343. #pragma mark 加载当前WKWebView
  344. - (void)loadCurrentWKWebView
  345. {
  346. //NSString *urlStr = [_urlStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  347. //_urlStr = urlStr.length ? urlStr : [_urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  348. NSString *lang = [[NSUserDefaults standardUserDefaults] objectForKey:KAppLanguage];
  349. if([lang isEqualToString:@"zh-cn"])
  350. {
  351. lang = @"zh-cn";
  352. }else if ([lang isEqualToString:@"ja"]){
  353. lang = @"ja";
  354. }else if([lang isEqualToString:@"en"]){
  355. lang = @"en-us";
  356. }else if ([lang isEqualToString:@"th"]){
  357. lang = @"th";
  358. }else if ([lang isEqualToString:@"zh-Hant"]){
  359. //繁体
  360. lang = @"zh-tc";
  361. }else if([lang isEqualToString:@"zh-Hans"]){
  362. lang = @"zh-cn";
  363. } else if([lang isEqualToString:@"vi"]){
  364. lang = @"vi";
  365. }else if([lang isEqualToString:@"ar"]){
  366. lang = @"ar";
  367. }
  368. else
  369. {
  370. lang = @"zh-en";
  371. }
  372. if ([_urlStr containsString:@"?"]) {
  373. _urlStr = [NSString stringWithFormat:@"%@&token=%@&language=%@",_urlStr,[GlobalVariables sharedInstance].token,lang];
  374. }else{
  375. _urlStr = [NSString stringWithFormat:@"%@?token=%@&language=%@",_urlStr,[GlobalVariables sharedInstance].token,lang];
  376. }
  377. _urlStr = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)_urlStr,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",NULL,kCFStringEncodingUTF8));
  378. NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:_urlStr]];
  379. // [request setHTTPMethod:![BGUtils isBlankString:_httpMethodStr] ? _httpMethodStr : @"POST"];
  380. request.timeoutInterval = kWebViewTimeoutInterval; // 设置请求超时
  381. // [request setHTTPBody: [_urlStr dataUsingEncoding: NSUTF8StringEncoding]];
  382. [self.webView loadRequest:request];
  383. }
  384. #pragma mark 重新加载当前WKWebView
  385. - (void)reLoadCurrentWKWebView
  386. {
  387. [self.webView reload];
  388. }
  389. #pragma mark webview返回,此时不一定会结束该controller
  390. - (void)webViewReturnBtnPress
  391. {
  392. // 退出或者返回时做该判断防止内存泄露
  393. if ([self.webView isLoading])
  394. {
  395. [self.webView stopLoading];
  396. }
  397. if ([self.webView canGoBack])
  398. {
  399. [self.webView goBack];
  400. }
  401. else
  402. {
  403. [self webViewCloseBtnPress];
  404. }
  405. }
  406. #pragma mark 关闭当前页面
  407. - (void)webViewCloseBtnPress
  408. {
  409. // 退出或者返回时做该判断防止内存泄露
  410. if ([self.webView isLoading])
  411. {
  412. [self.webView stopLoading];
  413. }
  414. [[NSNotificationCenter defaultCenter] removeObserver:self];
  415. if (self.userContentC)
  416. {
  417. [self removeScriptMessageHandler];
  418. }
  419. if (self.isSmallScreen)
  420. {
  421. [[LiveCenterManager sharedInstance] showChangeAuctionLiveScreenSOfIsSmallScreen:NO nextViewController:nil delegateWindowRCNameStr:@"BGTabBarController" complete:^(BOOL finished) {
  422. }];
  423. }
  424. else
  425. {
  426. UIViewController *tmpVC = [self.navigationController popViewControllerAnimated:YES];
  427. if (!tmpVC)
  428. {
  429. [self dismissViewControllerAnimated:YES completion:^{
  430. }];
  431. }
  432. }
  433. }
  434. #pragma mark 移除ScriptMessageHandler,防止退出时内存泄露
  435. - (void)removeScriptMessageHandler
  436. {
  437. // 子类重写
  438. }
  439. #pragma mark - ----------------------- webview生命周期相关函数 -----------------------
  440. #pragma mark js请求oc
  441. - (void)evaluateMyJavaScript:(WKWebView *)webView
  442. {
  443. NSString *path=[[NSBundle mainBundle] pathForResource:@"fun.js" ofType:nil];
  444. NSString *jsStr=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
  445. [webView evaluateJavaScript:jsStr completionHandler:nil];
  446. }
  447. #pragma mark 开始加载
  448. - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
  449. {
  450. NSLog(@"%s",__func__);
  451. _beginTime = [[NSDate date] timeIntervalSince1970];
  452. NSLog(ASLocalizedString(@"============加载webview开始时间点:%f"),_beginTime);
  453. [self evaluateMyJavaScript:webView];
  454. NSString *curUrl = [webView.URL absoluteString];
  455. NSMutableString *curMstr = [NSMutableString stringWithString:curUrl];
  456. NSRange curSubstr = [curMstr rangeOfString:@"show_prog=1"]; // 字符串查找,可以判断字符串中是否有
  457. if (curSubstr.location != NSNotFound || [curUrl hasSuffix:@"show_prog=1"] || _isShowIndicator)
  458. {
  459. [self showMyHud:@""];
  460. }
  461. // 判断是否拨打电话
  462. if ([curUrl hasPrefix:@"tel:"])
  463. {
  464. NSMutableString *mstr = [NSMutableString stringWithString:curUrl];
  465. // 查找并删除
  466. NSRange substr = [mstr rangeOfString:@"tel:"]; // 字符串查找,可以判断字符串中是否有
  467. if (substr.location != NSNotFound)
  468. {
  469. [mstr deleteCharactersInRange:substr];
  470. }
  471. NSString *telUrl = [NSString stringWithFormat:@"telprompt:%@",mstr];
  472. NSURL *url = [[NSURL alloc] initWithString:telUrl];
  473. [[UIApplication sharedApplication] openURL:url];
  474. }
  475. }
  476. #pragma mark 加载出错
  477. - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
  478. {
  479. NSLog(@"%s",__func__);
  480. [self hideMyHud];
  481. if (self.isCanShowRightBarRefreshBtn)
  482. {
  483. [self initRightBarBtnItemWithType:RightBarBtnItemRefresh titleStr:ASLocalizedString(@"刷新")];
  484. }
  485. }
  486. #pragma mark 加载完毕
  487. - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
  488. {
  489. NSLog(@"%s",__func__);
  490. NSLog(ASLocalizedString(@"============加载webview总耗时:%f"),[[NSDate date] timeIntervalSince1970] - _beginTime);
  491. _isFirstLoad = NO;
  492. [self removeLaunchImgView];
  493. [UIApplication sharedApplication].networkActivityIndicatorVisible=false;
  494. [self evaluateMyJavaScript:webView];
  495. [webView evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';" completionHandler:nil];
  496. [webView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:nil];
  497. // if ([BGUtils isBlankString:_navTitleStr])
  498. // {
  499. self.navigationItem.title = webView.title;
  500. // }
  501. [self hideMyHud];
  502. [self saveCookie:webView];
  503. }
  504. #pragma mark 保存cookie
  505. - (void)saveCookie:(WKWebView *)webView
  506. {
  507. NSHTTPCookie *sessinCookie;
  508. NSHTTPCookieStorage *sharedHTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
  509. NSArray *cookies = [sharedHTTPCookieStorage cookiesForURL:webView.URL];
  510. NSEnumerator *enumerator = [cookies objectEnumerator];
  511. NSHTTPCookie *cookie;
  512. while (cookie = [enumerator nextObject])
  513. {
  514. if (![cookie.name isEqualToString:@""] && ![cookie.value isEqualToString:@""] )
  515. {
  516. [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
  517. if ([cookie.name isEqualToString:@"PHPSESSID2"])
  518. {
  519. sessinCookie = cookie;
  520. }
  521. }
  522. }
  523. //当请求成共后调用如下代码, 保存Cookie
  524. NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookies];
  525. [[NSUserDefaults standardUserDefaults] setObject:data forKey:kMyCookies];
  526. }
  527. - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation
  528. {
  529. [self performSelector:@selector(removeLaunchImgView) withObject:nil afterDelay:5];
  530. [self evaluateMyJavaScript:webView];
  531. if (_isFirstLoad)
  532. {
  533. [self performSelector:@selector(hideMyHud) withObject:nil afterDelay:5];
  534. }
  535. else
  536. {
  537. [self performSelector:@selector(hideMyHud) withObject:nil afterDelay:1.5];
  538. }
  539. _isFirstLoad = NO;
  540. [self saveCookie:webView];
  541. }
  542. #pragma mark Decides whether to allow or cancel a navigation.
  543. - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
  544. {
  545. decisionHandler(WKNavigationActionPolicyAllow);
  546. }
  547. - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
  548. {
  549. decisionHandler(WKNavigationResponsePolicyAllow);
  550. }
  551. - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
  552. {
  553. [FanweMessage alert:message];
  554. completionHandler();
  555. }
  556. - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler
  557. {
  558. [FanweMessage alert:nil message:message destructiveAction:^{
  559. completionHandler(YES);
  560. } cancelAction:^{
  561. completionHandler(NO);
  562. }];
  563. }
  564. #pragma mark - ----------------------- HUD -----------------------
  565. - (void)showMyHud:(NSString *)statusStr
  566. {
  567. if (![BGUtils isBlankString:statusStr])
  568. {
  569. [SVProgressHUD showWithStatus:statusStr];
  570. }
  571. else
  572. {
  573. [SVProgressHUD showWithStatus:ASLocalizedString(@"加载中...")];
  574. }
  575. }
  576. - (void)hideMyHud
  577. {
  578. [SVProgressHUD dismiss];
  579. }
  580. @end