// // ZBAdWebViewController.m // ZBProject // // Created by 学丽 on 2019/4/10. // Copyright © 2019 ZB. All rights reserved. // #import "ZBAdWebViewController.h" static NSString *refresh_h5 = @"refresh_h5"; static NSString *app_h5_get_token = @"app_h5_get_token";//获取token static NSString *app_h5_save_message=@"app_h5_save_message"; static NSString *app_h5_get_message=@"app_h5_get_message"; static NSString *app_h5_to_goodsdetail=@"app_h5_to_goodsdetail"; @interface ZBAdWebViewController () @property (nonatomic, strong) WKWebView *webView; /** 加载进度条 */ @property (nonatomic, strong) UIProgressView *progressView; @property (nonatomic, strong) UIButton *backButton; @property (nonatomic, strong) UIButton *closeButton; @property (nonatomic, strong) UIButton *refreshButton; @end @implementation ZBAdWebViewController - (void)viewDidLoad { [super viewDidLoad]; [self addNotification]; [self configNavigationBar]; [self addUserhandler]; [self loadRequest]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [_backButton setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal]; self.navBar.backgroundColor = [UIColor clearColor]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; } - (void)addNotification { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshH5Action) name:UIApplicationDidBecomeActiveNotification object:nil]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(endFullScreen) name:UIWindowDidBecomeHiddenNotification object:nil]; } //处理web视频全屏播放时 状态栏消失 - (void)endFullScreen { [[UIApplication sharedApplication]setStatusBarHidden:false animated:false]; } - (void)configNavigationBar { self.view.backgroundColor = [UIColor whiteColor]; [self.view addSubview:self.webView]; [self.view addSubview:self.progressView]; self.navBar.showNavigationBarBottomLine = YES; [self.navBar setCustomLeftButtons:@[self.backButton]]; [self.navBar setCustomRightButtons:@[self.refreshButton]]; if (@available(iOS 11.0, *)) { self.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;//UIScrollView也适用 }else { self.automaticallyAdjustsScrollViewInsets = NO; } } - (void)addUserhandler { [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_get_token]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_save_message]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_get_message]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_to_goodsdetail]; } #pragma mark --- WKScriptMessageHandler - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:app_h5_get_token]){ //传token给js [self sendUserTokenToJS:message]; }else if ([message.name isEqualToString:app_h5_save_message]) { [self saveLocal:message]; }else if ([message.name isEqualToString:app_h5_get_message]) { [self sendmessageToJS:message]; }else if ([message.name isEqualToString:app_h5_to_goodsdetail]) {//跳转详情 [self getGoodDetail:message]; } } #pragma mark--跳转详情 -(void)getGoodDetail:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; ZBGoodModel *model =[[ZBGoodModel alloc]init]; model.goods_id = [NSString stringWithFormat:@"%@",dict[@"goodsId"]]; ZBGoodDetailVC *detailVC = [[ZBGoodDetailVC alloc] init]; detailVC.model = model; [self.navigationController pushViewController:detailVC animated:YES]; } #pragma mark---保存本地 -(void)saveLocal:(WKScriptMessage *)message { NSLog(@"%@",message.body); NSDictionary *dic =[self dictionaryWithJsonString:message.body]; [PublicFunction saveMessage:dic]; } /** 传消息给js */ - (void)sendmessageToJS:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; NSString *jsMethod = dict[@"js_callback"]; NSDictionary *tokenPara = [PublicFunction getMessage]; if (tokenPara.allKeys.count == 0) { return; } NSString *jsonDict = [self convertToJsonData:tokenPara]; NSString *callBacKMethod = [NSString stringWithFormat:@"%@('%@')",jsMethod,jsonDict]; [self.webView evaluateJavaScript:callBacKMethod completionHandler:^(id _Nullable value, NSError * _Nullable error) { }]; } /** 传token给js */ - (void)sendUserTokenToJS:(WKScriptMessage *)message { __block NSString *token = [AccountTool account].token; NSDictionary *dict = [self dictionaryWithJsonString:message.body]; NSString *jsMethod = dict[@"js_callback"]; if (!token) { token = @""; } NSDictionary *tokenPara = @{@"token":token}; NSString *jsonDict = [self convertToJsonData:tokenPara]; NSString *callBacKMethod = [NSString stringWithFormat:@"%@('%@')",jsMethod,jsonDict]; [self.webView evaluateJavaScript:callBacKMethod completionHandler:^(id _Nullable value, NSError * _Nullable error) { }]; } - (void)loadRequest { if (@available(iOS 9.0, *)) { NSArray * types=@[WKWebsiteDataTypeCookies,WKWebsiteDataTypeLocalStorage]; NSSet *websiteDataTypes= [NSSet setWithArray:types]; NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ }]; } // NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.url]]; NSString *urlStr = [self.url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15.0]; [self.webView loadRequest:theRequest]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navBar.navTitleLabel.textColor = [UIColor whiteColor]; [self.navBar setNavTitle:self.webView.title]; } - (void)refreshH5Action { if (@available(iOS 9.0, *)) { NSArray * types=@[WKWebsiteDataTypeCookies,WKWebsiteDataTypeLocalStorage]; NSSet *websiteDataTypes= [NSSet setWithArray:types]; NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ }]; } NSString *callBacKMethod = [NSString stringWithFormat:@"%@()",refresh_h5]; [self.webView evaluateJavaScript:callBacKMethod completionHandler:^(id _Nullable value, NSError * _Nullable error) { }]; } /** kvo监听进度条 @param keyPath keyPath description @param object object description @param change change description @param context context description */ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))] && object == self.webView ) { [self.progressView setAlpha:1.0]; [self.progressView setProgress:self.webView.estimatedProgress ]; if (self.webView.estimatedProgress >= 1.0) { [UIView animateWithDuration:0.7 animations:^{ [self.progressView setProgress:1.0 animated:YES]; [self.progressView setAlpha:0.0]; }]; } }else{ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } /** 当网页加载完成的时候调用 @param webView web描述 @param navigation 导航的描述 */ - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ [self.navBar setNavTitle:self.webView.title]; [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:NO]; [self updateNavigationBarButtons]; [self.webView.scrollView.mj_header endRefreshing]; } #pragma mark- WKNavigationDelegate delegate /** 开始加载web的时候 @param webView webView description @param navigation navigation description */ - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{ //开始加载的时候,让进度条显示 self.progressView.hidden = NO; self.progressView.progress = 0; self.progressView.alpha = 1.0; [UIView animateWithDuration:0.8 animations:^{ self.progressView.progress = 0.6; }]; } -(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *url = navigationAction.request.URL; UIApplication *app = [UIApplication sharedApplication]; // 打开appstore if ([url.absoluteString containsString:@"https://itunes.apple.com/cn/app/"]) { if ([app canOpenURL:url]) { //设备系统为IOS 10.0或者以上的 if (@available(iOS 10.0, *)) { [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; } else { [[UIApplication sharedApplication] openURL:url]; } decisionHandler(WKNavigationActionPolicyCancel); return; } } decisionHandler(WKNavigationActionPolicyAllow); } - (WKWebView *)webView{ if (!_webView) { WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.allowsInlineMediaPlayback = NO; _webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, NavBarHeight, SCREEN_WIDTH, SCREEN_HEIGHT-NavBarHeight-SafeBottomHeight) configuration:config]; _webView.backgroundColor = [UIColor colorWithRed:240.0/255 green:240.0/255 blue:240.0/255 alpha:1.0]; _webView.navigationDelegate = self; _webView.UIDelegate = self; //使用kvo监听进度 [_webView addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:0 context:nil]; //手势触摸滑动 _webView.allowsBackForwardNavigationGestures = YES; //自适应 [_webView sizeToFit]; } return _webView; } #pragma mark- #pragma mark- SetupConstraints /** 加载配置以及视图添加*/ - (void)loadSubViewsConfiguration{ [self.view addSubview:self.webView]; } - (UIButton *)backButton { if (!_backButton) { _backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; [_backButton setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal]; [_backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; } return _backButton; } - (UIButton *)closeButton { if (!_closeButton) { _closeButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; [_closeButton setImage:[UIImage imageNamed:@"close_web"] forState:UIControlStateNormal]; [_closeButton addTarget:self action:@selector(closeAction) forControlEvents:UIControlEventTouchUpInside]; } return _closeButton; } - (UIButton *)refreshButton { if (!_refreshButton) { _refreshButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; [_refreshButton setImage:[UIImage imageNamed:@"icon_web_refresh"] forState:UIControlStateNormal]; [_refreshButton addTarget:self action:@selector(refreshAction) forControlEvents:UIControlEventTouchUpInside]; _refreshButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; } return _refreshButton; } - (void)backAction { NSArray *viewControllers = self.navigationController.viewControllers; if (viewControllers.count < 1){ [self dismissViewControllerAnimated:YES completion:nil]; }else { if (self.webView.canGoBack) { [self.webView goBack]; }else{ [self.navigationController popViewControllerAnimated:YES]; } } } #pragma mark ----------- - (void)updateNavigationBarButtons { if (self.webView.canGoBack) { [self.navBar setCustomLeftButtons:@[self.backButton,self.closeButton]]; }else { [self.navBar setCustomLeftButtons:@[self.backButton]]; } } - (void)closeAction { [self.navigationController popViewControllerAnimated:YES]; } - (void)refreshAction { [self.webView reload]; } - (UIProgressView *)progressView{ if (!_progressView) { _progressView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault]; _progressView.frame = CGRectMake(0, NavBarHeight, self.view.frame.size.width, 2); //设置进度条的色彩 [_progressView setTrackTintColor:[UIColor colorWithRed:240.0/255 green:240.0/255 blue:240.0/255 alpha:1.0]]; _progressView.progressTintColor = [UIColor homeRedColor]; } return _progressView; } //观察的移除 - (void)dealloc{ [self.webView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } /** json字符串转字典 */ - (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return nil; } return dic; } /** 字典转json字符串 */ - (NSString *)convertToJsonData:(NSDictionary *)dict { NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString; if (!jsonData) { NSLog(@"%@",error); }else{ jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; } NSMutableString *mutStr = [NSMutableString stringWithString:jsonString]; NSRange range = {0,jsonString.length}; //去掉字符串中的空格 [mutStr replaceOccurrencesOfString:@" " withString:@"" options:NSLiteralSearch range:range]; NSRange range2 = {0,mutStr.length}; //去掉字符串中的换行符 [mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2]; return mutStr; } @end