// // KBWebDetailController.m // YouHuiProject // // Created by 小花 on 2018/5/29. // Copyright © 2018年 kuxuan. All rights reserved. // #import "KBWebDetailController.h" #import #import "WYWeakScriptMessageDelegate.h" #import "KBLoginViewController.h" #import "WechatShareTool.h" #import #import #import static NSString *app_h5_close = @"app_h5_close"; static NSString *app_h5_get_token = @"app_h5_get_token"; static NSString *app_h5_wx_share = @"app_h5_wx_share"; static NSString *app_h5_get_wechat_info = @"app_h5_get_wechat_info"; static NSString *refresh_h5 = @"refresh_h5"; static NSString *app_h5_login = @"app_h5_login"; //h5唤起原生的登录 static NSString *app_h5_wx_share_url = @"app_h5_wx_share_url"; //分享url static NSString *app_h5_wx_share_image = @"app_h5_wx_share_image"; //分享到微信image static NSString *app_h5_wx_share_video = @"app_h5_wx_share_video"; //分享到微信video static NSString *app_h5_wx_share_min = @"app_h5_wx_share_min"; //分享微信小程序(只支持微信好友) static NSString *app_h5_open_taobao_url = @"app_h5_open_taobao_url"; //打开淘宝url @interface KBWebDetailController () @property (nonatomic, strong) WKWebView *webView; /** 加载进度条 */ @property (nonatomic, strong) UIProgressView *progressView; @property (nonatomic, strong) UIButton *backButton; @property (nonatomic, strong) UIButton *closeButton; @end @implementation KBWebDetailController - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; } - (void)viewDidLoad { [super viewDidLoad]; self.navigationController.navigationBar.hidden = YES; [self addNotification]; [self configNavigationBar]; [self addUserhandler]; [self loadRequest]; } - (void)addNotification { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshH5Action) name:UIApplicationDidBecomeActiveNotification object:nil]; } - (void)configNavigationBar { self.view.backgroundColor = [UIColor whiteColor]; [self.view addSubview:self.webView]; [self.view addSubview:self.progressView]; self.navigationBar.showNavigationBarBottomLine = YES; // [self.navigationBar setNavTitle:@"商品详情"]; [self.navigationBar setCustomLeftButtons:@[self.backButton]]; self.navigationBar.backgroundColor = [UIColor clearColor]; if (@available(iOS 11.0, *)) { self.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;//UIScrollView也适用 }else { self.automaticallyAdjustsScrollViewInsets = NO; } } - (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]]; NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15.0]; [self.webView loadRequest:theRequest]; } - (void)addUserhandler { [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_close]; [[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_wx_share]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_get_wechat_info]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_login]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_wx_share_url]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_wx_share_image]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_wx_share_video]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_wx_share_min]; [[self.webView configuration].userContentController addScriptMessageHandler:[[WYWeakScriptMessageDelegate alloc] initWithDelegate:self] name:app_h5_open_taobao_url]; } #pragma mark --- WKScriptMessageHandler - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:app_h5_close]) { //关闭页面 [self.navigationController popViewControllerAnimated:YES]; } else if ([message.name isEqualToString:app_h5_get_token]){ //传token给js [self sendUserTokenToJS:message]; } else if ([message.name isEqualToString:app_h5_wx_share]){ //调起原生分享 [self shareToNative:message]; } else if ([message.name isEqualToString:app_h5_get_wechat_info]){ //获取微信信息 [self getWechatInfoWithMessage:message]; } else if ([message.name isEqualToString:app_h5_wx_share_image]){ //分享图片 [self shareImage:message]; } else if ([message.name isEqualToString:app_h5_wx_share_url]){ //分享url [self shareURL:message]; } else if ([message.name isEqualToString:app_h5_wx_share_video]){ //分享video [self shareVideo:message]; } else if ([message.name isEqualToString:app_h5_wx_share_min]){ //分享小程序 [self shareMinProgram:message]; }else if ([message.name isEqualToString:app_h5_login]){ //获取token [self gotoNativeLogin:message]; }else if ([message.name isEqualToString:app_h5_open_taobao_url]){ //打开淘宝 [self openTaobao:message]; } else { } } - (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) { }]; } /** 传token给js */ - (void)sendUserTokenToJS:(WKScriptMessage *)message { NSString *token = [AccountTool account].token; NSString *openid = [AccountTool account].openId; NSString *unionid = [AccountTool account].unionid; if (![AccountTool isLogin] || openid==nil || unionid ==nil) { KBLoginViewController *login = [[KBLoginViewController alloc] init]; [self presentViewController:login animated:YES completion:nil]; return; } NSDictionary *dict = [self dictionaryWithJsonString:message.body]; NSString *jsMethod = dict[@"js_callback"]; if (!token) { token = @""; } NSDictionary *tokenPara = @{@"token":token, @"openid":openid, @"unionid":unionid, }; NSString *jsonDict = [self convertToJsonData:tokenPara]; NSString *callBacKMethod = [NSString stringWithFormat:@"%@('%@')",jsMethod,jsonDict]; [self.webView evaluateJavaScript:callBacKMethod completionHandler:^(id _Nullable value, NSError * _Nullable error) { }]; } /** 唤起登录 */ - (void)gotoNativeLogin:(WKScriptMessage *)message { if (![AccountTool isLogin]) { KBLoginViewController *login = [[KBLoginViewController alloc] init]; [self presentViewController:login animated:YES completion:nil]; return; } NSDictionary *dict = [self dictionaryWithJsonString:message.body]; NSString *jsMethod = dict[@"js_callback"]; NSString *token = [AccountTool account].token; NSDictionary *param = @{@"token":token, }; NSString *jsonDict = [self convertToJsonData:param]; NSString *callBacKMethod = [NSString stringWithFormat:@"%@('%@')",jsMethod,jsonDict]; [self.webView evaluateJavaScript:callBacKMethod completionHandler:^(id _Nullable value, NSError * _Nullable error) { }]; } /** 获取微信信息 */ - (void)getWechatInfoWithMessage:(WKScriptMessage *)message { NSString *openid = [AccountTool account].openId; NSString *unionid = [AccountTool account].unionid; if (![AccountTool isLogin] || openid==nil || unionid ==nil) { KBLoginViewController *login = [[KBLoginViewController alloc] init]; [self presentViewController:login animated:YES completion:nil]; return; } NSDictionary *dict = [self dictionaryWithJsonString:message.body]; NSString *jsMethod = dict[@"js_callback"]; NSDictionary *param = @{@"openid":openid, @"unionid":unionid }; NSString *jsonDict = [self convertToJsonData:param]; NSString *callBacKMethod = [NSString stringWithFormat:@"%@('%@')",jsMethod,jsonDict]; [self.webView evaluateJavaScript:callBacKMethod completionHandler:^(id _Nullable value, NSError * _Nullable error) { }]; } /** 调起分享 */ - (void)shareToNative:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; if ([dict[@"shareType"] isEqualToString:@"1"]) { [self shareImageWithplatformType:UMSocialPlatformType_WechatSession withDict:dict]; }else { [self shareImageWithplatformType:UMSocialPlatformType_WechatTimeLine withDict:dict]; } } - (void)shareImage:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; if ([dict[@"shareType"] isEqualToString:@"1"]) { [WechatShareTool shareImageWithplatformType:UMSocialPlatformType_WechatSession withDict:dict]; }else { [WechatShareTool shareImageWithplatformType:UMSocialPlatformType_WechatTimeLine withDict:dict]; } } - (void)shareURL:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; if ([dict[@"shareType"] isEqualToString:@"1"]) { [WechatShareTool shareURLWithplatformType:UMSocialPlatformType_WechatSession withDict:dict]; }else { [WechatShareTool shareURLWithplatformType:UMSocialPlatformType_WechatTimeLine withDict:dict]; } } - (void)shareVideo:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; if ([dict[@"shareType"] isEqualToString:@"1"]) { [WechatShareTool shareVideoWithplatformType:UMSocialPlatformType_WechatSession withDict:dict]; }else { [WechatShareTool shareVideoWithplatformType:UMSocialPlatformType_WechatTimeLine withDict:dict]; } } - (void)shareMinProgram:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; [WechatShareTool shareMinProgramWithplatformType:UMSocialPlatformType_WechatSession withDict:dict]; } - (void)openTaobao:(WKScriptMessage *)message { NSDictionary *dict = [self dictionaryWithJsonString:message.body]; NSString *url = dict[@"taobaoUrl"]; [self jumpToTaobaoWithUrl:url]; } - (void)jumpToTaobaoWithUrl:(NSString *)url { id page = [AlibcTradePageFactory page:url]; //淘客信息 AlibcTradeTaokeParams *taoKeParams=[[AlibcTradeTaokeParams alloc] init]; taoKeParams.pid= ALTK_PID; //打开方式 AlibcTradeShowParams* showParam = [[AlibcTradeShowParams alloc] init]; showParam.openType = AlibcOpenTypeNative; [[AlibcTradeSDK sharedInstance].tradeService show:self.parentViewController page:page showParams:showParam taoKeParams:taoKeParams trackParam:nil tradeProcessSuccessCallback:^(AlibcTradeResult * _Nullable result) { } tradeProcessFailedCallback:^(NSError * _Nullable error) { }]; } -(void)shareImageWithplatformType:(UMSocialPlatformType)platformType withDict:(NSDictionary *)dict{ //创建分享消息对象 UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; //创建图片内容对象 UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:dict[@"shareTitle"] descr:dict[@"shareDescirpt"] thumImage:dict[@"shareImageUrl"]]; shareObject.webpageUrl = dict[@"shareUrl"]; messageObject.shareObject = shareObject; [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:nil completion:^(id data, NSError *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]; } } #pragma mark- #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; }]; } /** 当网页加载完成的时候调用 @param webView web描述 @param navigation 导航的描述 */ - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ [self.navigationBar setNavTitle:self.webView.title]; [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:NO]; [self updateNavigationBarButtons]; } -(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); } #pragma mark ----------- - (void)updateNavigationBarButtons { if (self.webView.canGoBack) { [self.navigationBar setCustomLeftButtons:@[self.backButton,self.closeButton]]; }else { [self.navigationBar setCustomLeftButtons:@[self.backButton]]; } } - (void)backAction { if (self.webView.canGoBack) { [self.webView goBack]; }else{ [self.navigationController popViewControllerAnimated:YES]; } } - (void)closeAction { [self.navigationController popViewControllerAnimated:YES]; } - (WKWebView *)webView{ if (!_webView) { _webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, NavBarHeight, SCREEN_WIDTH, SCREEN_HEIGHT-NavBarHeight)]; _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]; //自适应 [_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; } - (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; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end