// // XPWebViewController.m // YuMi // // Created by zu on 2021/9/16. // #import "XPWebViewController.h" #import "AccountInfoStorage.h" #import "DJDKMIMOMColor.h" #import "YUMIMacroUitls.h" #import "YYUtility.h" #import "HttpRequestHelper.h" #import "TTPopup.h" #import "XCCurrentVCStackManager.h" #import "Api+Mine.h" #import "YuMi-swift.h" ///vc #import "Api+Mine.h" #import "XPWebViewNavView.h" typedef NS_ENUM(NSUInteger, RightNavigationPushType){ ///跳转h5页面 RightNavigationPushType_Web = 1, ///分享 RightNavigationPushType_Share = 2, ///跳转原生页面 RightNavigationPushType_AppPage = 3, ///分享图片 RightNavigationPushType_SharePicture = 5 }; @interface WeakWebViewScriptMessageDelegate : NSObject //WKScriptMessageHandler 这个协议类专门用来处理JavaScript调用原生OC的方法 @property (nonatomic, weak) id scriptDelegate; - (instancetype)initWithDelegate:(id)scriptDelegate; @end @implementation WeakWebViewScriptMessageDelegate - (instancetype)initWithDelegate:(id)scriptDelegate { self = [super init]; if (self) { _scriptDelegate = scriptDelegate; } return self; } //遵循WKScriptMessageHandler协议,必须实现如下方法,然后把方法向外传递 //通过接收JS传出消息的name进行捕捉的回调方法 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([self.scriptDelegate respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) { [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message]; } } @end @interface XPWebViewController () //@property (strong, nonatomic) WKWebView *webview; @property (strong, nonatomic) UIProgressView *progressView; @property (nonatomic, strong) WKUserContentController *pi_userContentController; ///分享的内容 @property (nonatomic,copy) NSDictionary *shareDic; ///分享的内容 @property (nonatomic,copy) NSDictionary *savePhotoDic; /// @property (nonatomic,strong) XPWebViewNavView *navView; /// @property (nonatomic,assign) BOOL isCustom; /// 订单编号 @property (nonatomic,copy) NSString *orderId; @property (nonatomic, assign) BOOL isHideNavBar; @end NSString * const kJSOpenPurse = @"openPurse"; NSString * const kJSOpenChargePage = @"openChargePage"; NSString * const kJSChargePayPage = @"chargePayPage"; NSString * const kJSChargePayClickPage = @"chargePayClickPage"; NSString * const kJSOpenSharePage = @"openSharePage"; NSString * const kJSGetUid = @"getUid"; NSString * const kJSGetDeviceId = @"getDeviceId"; NSString * const kJSGetTicket = @"getTicket"; NSString * const kJSGetDeviceInfo = @"getDeviceInfo"; NSString * const kJSOpenFaceLiveness = @"openFaceLiveness"; NSString * const kJSInitNav = @"initNav"; NSString * const kJSGetRoomUid = @"getRoomUid"; NSString * const kOpenPersonPage = @"openPersonPage"; NSString * const kInitShowNav = @"initShowNav"; NSString * const kCloseWebView = @"closeWebView"; NSString * const kJumpAppointPage = @"jumpAppointPage"; NSString * const kJSOpenRoom = @"openRoom"; NSString * const kJSOpenRoomForGiftId = @"openRoomForGiftId"; NSString * const kJSOpenChatPage = @"geToChatPage"; NSString * const kJSOpenAppConcernedChat = @"openAppConcernedChat"; NSString * const kJSSavePictureShare = @"savePictureShare"; NSString * const kJSGoToExchangeGold = @"goToExchangeGold"; NSString * const kJSOpenPayment = @"openPayment"; NSString * const kJSOpenPaymentCallback = @"openPaymentCallback"; NSString * const kJSVerifyCaptchaCallBack = @"closeToVerify"; NSString * const kJSShowShareCallBack = @"showShareAction"; @implementation XPWebViewController - (instancetype)initWithCustomizeNav:(BOOL)isCustom { self = [super init]; if (self) { self.isCustom = isCustom; } return self; } - (instancetype)initWithRoomUID:(NSString * _Nullable)roomUid { self = [super init]; if (self) { self.roomUid = roomUid; self.isLoginStatus = YES; } return self; } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; if (self.isHideNavBar) { if (self.navigationController) { [self.navigationController setNavigationBarHidden:YES]; } } } - (void)viewDidLoad { [super viewDidLoad]; [self initView]; } - (void)initView { if (self.navigationController.viewControllers.count > 1){ UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"common_nav_back"]ms_SetImageForRTL] style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClick)]; leftBarButtonItem.tintColor = [DJDKMIMOMColor mainTextColor]; self.navigationItem.leftBarButtonItem = leftBarButtonItem; } self.webview.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; if(self.isCustom == YES){ [self.view addSubview:self.navView]; [self.view addSubview:self.webview]; [self.view addSubview:self.progressView]; [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.top.equalTo(self.view); make.height.mas_equalTo(kNavigationHeight); }]; [self.webview mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.bottom.equalTo(self.view); make.top.equalTo(self.navView.mas_bottom); }]; [self.progressView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.equalTo(self.view); make.height.mas_equalTo(1); make.top.equalTo(self.navView.mas_bottom); }]; }else{ [self.view addSubview:self.webview]; [self.view addSubview:self.progressView]; [self.webview mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.top.bottom.mas_equalTo(self.view); }]; } } - (void)xPWebViewNavView:(XPWebViewNavView *)view didClickBack:(UIButton *)sender{ if(self.is_Pi_FairyPay){ [self willMoveToParentViewController:nil]; //1 [self.view removeFromSuperview]; //2 [self removeFromParentViewController]; //3 return; } if(self.isFairyPay){ if(self.CloseWebViewBlock){ self.CloseWebViewBlock(YES); } return; } [self dismissViewControllerAnimated:YES completion:nil]; } //加载完成 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { //加载完成后隐藏progressView self.progressView.hidden = YES; if (self.urlLoadCompleted) { self.urlLoadCompleted(YES, nil); } #if DEBUG NSString *fileName = @"vconsole.min.js"; // 你要查找的文件名 NSString *directory = [[NSBundle mainBundle] resourcePath]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:directory]; NSString *filePath; for (NSString *path in enumerator) { if ([[path lastPathComponent] containsString:fileName]) { filePath = [directory stringByAppendingPathComponent:path]; break; } } if (filePath.length > 0) { NSString *vConsoleScript = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; [webView evaluateJavaScript:vConsoleScript completionHandler:nil]; // 初始化 vConsole NSString *initVConsoleScript = @"var vConsole = new VConsole();"; [webView evaluateJavaScript:initVConsoleScript completionHandler:nil]; } #endif } #if DEBUG - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response; NSDictionary *headers = response.allHeaderFields; // NSLog(@"Response Headers: %@", headers); NSString *contentEncoding = headers[@"Content-Encoding"]; if ([contentEncoding isEqualToString:@"gzip"]) { // NSLog(@"✅ Gzip 响应已启用"); } else { // NSLog(@"❌ Gzip 响应未启用"); } decisionHandler(WKNavigationResponsePolicyAllow); } #endif //加载失败 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error { //加载失败同样需要隐藏progressView self.progressView.hidden = YES; if (self.urlLoadCompleted) { self.urlLoadCompleted(NO, error); } } //捕抓打电话事件 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *URL = navigationAction.request.URL; NSString *scheme = [URL scheme]; NSURLRequest *request = navigationAction.request; // Judge is whether to jump to other app. if (![scheme isEqualToString:@"https"] && ![scheme isEqualToString:@"http"]) { BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:request.URL]; if (canOpen) { [[UIApplication sharedApplication] openURL:request.URL options:@{} completionHandler:^(BOOL success) { }]; } decisionHandler(WKNavigationActionPolicyCancel); return; } decisionHandler(WKNavigationActionPolicyAllow); } - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{ if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential,card); }); } } - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { [self.webview evaluateJavaScript:@"document.location.href" completionHandler:^(id _Nullable response, NSError * _Nullable error) { NSString *currentUrl = [NSString stringWithFormat:@"%@", response]; ///测试环境只要有host就执行,方便h5连接本地调试 BOOL condition = currentUrl != nil && [currentUrl containsString:API_HOST_URL]; NSLog(@"-- -- - -- - - | -- -- - -- - -%@", response); NSLog(@"-- -- - -- - -%@: %@", message.name, message.body); #ifdef DEBUG condition = currentUrl != nil; #endif if(condition) { if ([message.name isEqualToString:kJSOpenSharePage]) { } else if ([message.name isEqualToString:kJSGetUid]) { NSString *uid = [[AccountInfoStorage instance] getUid]; NSString *js = [NSString stringWithFormat:@"getMessage(\"uid\",%@)", uid]; [self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) { // NSLog(@"%@",error); }]; } else if ([message.name isEqualToString:kJSGetTicket]) { NSString *ticket = [[AccountInfoStorage instance] getTicket]; NSString *js = [NSString stringWithFormat:@"getMessage(\"ticket\",\"%@\")",ticket]; [self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) { // NSLog(@"%@",error); }]; } else if ([message.name isEqualToString:kJSGetDeviceId]) { NSString *js = [NSString stringWithFormat:@"getMessage(\"deviceId\",\"%@\")",[YYUtility deviceUniqueIdentification]]; [self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) { // NSLog(@"%@",error); }]; } else if ([message.name isEqualToString:kJSGetDeviceInfo]) { NSDictionary *basicParmars = [HttpRequestHelper configBaseParmars:[[NSDictionary alloc] init]]; NSString *json = [basicParmars mj_JSONString]; NSString *js = [NSString stringWithFormat:@"getMessage(\"deviceInfo\",%@)", json]; [self.webview evaluateJavaScript:js completionHandler:^(id _Nullable ohter, NSError * _Nullable error) { // NSLog(@"%@", error); }]; } else if ([message.name isEqualToString:kJSOpenPurse]) { }else if([message.name isEqualToString:kJSChargePayPage]){ // NSString *money = [NSString stringWithFormat:@"%@",message.body] ; }else if([message.name isEqualToString:kJSChargePayClickPage]){ }else if ([message.name isEqualToString:kJSOpenChargePage]) { } else if ([message.name isEqualToString:kOpenPersonPage]) { } else if([message.name isEqualToString:kJSInitNav]) { [self initNav:message.body]; } else if([message.name isEqualToString:kJSGetRoomUid]) { NSString *js = [NSString stringWithFormat:@"getMessage(\"roomUid\",\"%@\")",self.roomUid]; [self.webview evaluateJavaScript:js completionHandler:^(id _Nullable other, NSError * _Nullable error) { // NSLog(@"%@",error); }]; } else if([message.name isEqualToString:kInitShowNav]) { if (((NSNumber *)message.body).intValue == 0) { if (self.InitShowNavBlock) { self.InitShowNavBlock(YES); return; } self.isHideNavBar = YES; if (self.navigationController) { [self.navigationController setNavigationBarHidden:YES]; } } } else if([message.name isEqualToString:kCloseWebView]) { if (self.CloseWebViewBlock) { self.CloseWebViewBlock(YES); return; } if (self.navigationController) { [self.navigationController popViewControllerAnimated:YES]; } } else if ([message.name isEqualToString:kJumpAppointPage]) { // h5与原生交互新协议 NSDictionary *bodyDict; if ([message.body isKindOfClass:[NSDictionary class]]) { bodyDict = message.body; } else if ([message.body isKindOfClass:[NSString class]]) { NSString *str = (NSString *)message.body; bodyDict = [str toJSONObject]; } NSInteger skyType = [bodyDict[@"routerType"] integerValue]; [self handleRouterType:skyType message:message]; }else if ([message.name isEqualToString:kJSOpenChatPage]){ }else if([message.name isEqualToString:kJSOpenAppConcernedChat]){ }else if ([message.name isEqualToString:kJSOpenRoom]) { } else if([message.name isEqualToString:kJSOpenRoomForGiftId]) { }else if ([message.name isEqualToString:kJSSavePictureShare]){ } else if([message.name isEqualToString:kJSGoToExchangeGold]){ } else if([message.name isEqualToString:kJSOpenPayment]) { [self handleOpenPayment:message.body]; } else if([message.name isEqualToString:kJSVerifyCaptchaCallBack]) { [self handleCaptchaResult:[message.body integerValue] == 1]; } else if([message.name isEqualToString:kJSShowShareCallBack]) { [self handleShareActioin:message.body]; } } }]; } #pragma mark - - (void)handleShareActioin:(NSString *)content { } - (void)handleCaptchaResult:(BOOL)reuslt { if (_verifyCaptcha) { self.verifyCaptcha(reuslt); } } #pragma mark - Payment Method - (void)handleOpenPayment:(NSString *)chargeProdId { } - (void)triggerOpenPaymentCallback:(NSInteger)code orderID:(NSString *)orderID productID:(NSString *)productID { NSDictionary *dic = @{@"code":@(code), @"orderId":orderID, @"productId":productID}; NSString *js = [NSString stringWithFormat:@"openPaymentCallback(%@)", dic.toJSONString]; @kWeakify(self); [self.webview evaluateJavaScript:js completionHandler:^(id _Nullable result, NSError * _Nullable error) { @kStrongify(self); [self hideHUD]; }]; } #pragma mark - private method - (void)handleRouterType:(NSInteger)skyType message:(WKScriptMessage *)message { NSDictionary *bodyDict = (NSDictionary *)message.body; switch (skyType) { case 1: { } break; case 7: { } break; case 8: { } break; case 75: { } break; default: break; } } - (void)setUrl:(NSString *)urlString{ _url = urlString; if (_url == nil) { return; } if (![_url hasPrefix:@"http"] && ![_url hasPrefix:@"https"]){ _url = [NSString stringWithFormat:@"%@/%@", [HttpRequestHelper getHostUrl], _url]; } if (![_url containsString:@"?"]) { _url = [NSString stringWithFormat:@"%@", _url]; } else { _url = [NSString stringWithFormat:@"%@", _url]; } // 去掉 urlString 中的空格。 NSString *noSpaceTextUrl = [_url stringByReplacingOccurrencesOfString:@" " withString:@""]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:noSpaceTextUrl]]; [self.webview loadRequest:request]; } - (void)backButtonClick { BOOL canGoBack = YES; if (self.webview.backForwardList.backList.count <= 1) { canGoBack = NO; } if ([self.webview canGoBack]) { [self.webview goBack]; } else { [self.navigationController popViewControllerAnimated:YES]; [self.pi_userContentController removeAllUserScripts]; } } #pragma mark - 分享 - (void)initNav:(NSDictionary *)response{ if(!response || ![response isKindOfClass:[NSDictionary class]])return; self.shareDic = response[@"data"]; if ([response[@"type"] intValue]== RightNavigationPushType_Web) { [self addNavigationItemWithTitles:@[response[@"data"][@"title"]] titleColor:[DJDKMIMOMColor alertTitleColor] isLeft:NO target:self action:@selector(gotoWebView) tags:nil]; }else if ([response[@"type"] intValue]== RightNavigationPushType_Share || [response[@"type"] intValue]== RightNavigationPushType_SharePicture){ [self addNavigationItemWithImageNames:@[@"family_person_share"] isLeft:NO target:self action:@selector(showSharePanel) tags:nil]; } } - (void)gotoWebView { if (self.shareDic[@"link"]) { XPWebViewController * webVC = [[XPWebViewController alloc] init]; webVC.url = self.shareDic[@"link"]; [self.navigationController pushViewController:webVC animated:YES]; } } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"estimatedProgress"]) { self.progressView.progress = self.webview.estimatedProgress; if (self.progressView.progress == 1) { __weak typeof (self)weakSelf = self; [UIView animateWithDuration:0.25f delay:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{ weakSelf.progressView.transform = CGAffineTransformMakeScale(1.0f, 1.0f); } completion:^(BOOL finished) { weakSelf.progressView.hidden = YES; }]; } } else if ([keyPath isEqualToString:@"title"]) { if (object == self.webview) { self.navigationItem.title = self.webview.title; if (self.urlLoadCompleted) {//半屏webview如果在加载完成回调后标题还会改变,在此处重新设置一遍 self.urlLoadCompleted(YES, nil); } }else{ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } - (void)dealloc { [self.webview removeObserver:self forKeyPath:@"estimatedProgress"]; [self.webview removeObserver:self forKeyPath:@"title"]; } - (WKWebView *)webview { if (_webview == nil) { WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init]; if (@available(iOS 10.0, *)) { configuration.mediaTypesRequiringUserActionForPlayback = NO; } else { // Fallback on earlier versions } configuration.allowsInlineMediaPlayback = YES; NSString *uid = [[AccountInfoStorage instance] getUid]; NSString *realCookie = [NSString stringWithFormat:@"%@=%@",@"uid",uid]; WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource: [NSString stringWithFormat:@"document.cookie = '%@';", realCookie] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO]; [self.pi_userContentController addUserScript:cookieScript]; ///禁止缩放 NSString *scaleJs = @"$('meta[name=description]').remove(); $('head').append( '' );"; WKUserScript *scaleScript = [[WKUserScript alloc] initWithSource:scaleJs injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO]; [self.pi_userContentController addUserScript:scaleScript]; //根据生成的WKUserScript对象,初始化WKWebViewConfiguration configuration.preferences.javaScriptEnabled = YES; configuration.preferences.javaScriptCanOpenWindowsAutomatically = YES; configuration.preferences.minimumFontSize = 10; configuration.selectionGranularity = WKSelectionGranularityCharacter; configuration.userContentController = self.pi_userContentController; CGSize size = [UIScreen mainScreen].bounds.size; _webview = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, size.width,size.height) configuration:configuration]; _webview.navigationDelegate = self; //添加KVO,WKWebView有一个属性estimatedProgress,就是当前网页加载的进度,所以监听这个属性 [_webview addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil]; //添加KVO,监听title属性 [_webview addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL]; UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(backButtonClick)]; [_webview addGestureRecognizer:swipeGesture]; [_webview.scrollView setShowsVerticalScrollIndicator:NO]; [_webview.scrollView setShowsHorizontalScrollIndicator:NO]; //set useragent __weak typeof(self) weakSelf = self; [_webview evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) { NSString *userAgent = result; if (![userAgent containsString:@"molistarAppIos erbanAppIos"]){ NSString *newUserAgent = [userAgent stringByAppendingString:@" molistarAppIos erbanAppIos"]; NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize]; [weakSelf.webview setCustomUserAgent:newUserAgent]; } }]; _webview.scrollView.bounces = NO; } return _webview; } - (UIProgressView *)progressView{ if (!_progressView) { _progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width, 1)]; _progressView.progressTintColor = [DJDKMIMOMColor appMainColor]; _progressView.trackTintColor = [UIColor clearColor]; _progressView.transform = CGAffineTransformMakeScale(1.0f, 1.0f); } return _progressView; } - (WKUserContentController *)pi_userContentController{ if (!_pi_userContentController) { //自定义的WKScriptMessageHandler 是为了解决内存不释放的问题 WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self]; _pi_userContentController = [[WKUserContentController alloc] init]; // 分享面板 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenSharePage]; // 钱包页面 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPurse]; // 充值页面 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenChargePage]; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSChargePayPage]; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSChargePayClickPage]; // 获取uid [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetUid]; // 获取设备id [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetDeviceId]; // 获取Ticket [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetTicket]; // 获取设备info [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetDeviceInfo]; // 实人认证: 打开原生人脸认证 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenFaceLiveness]; // 分享按钮 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSInitNav]; // 获取房间uid [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGetRoomUid]; // 进入个人主页 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kOpenPersonPage]; // 隐藏导航栏 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kInitShowNav]; // 隐藏导航栏 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kCloseWebView]; //装扮及其他活动页面 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJumpAppointPage]; //进入房间 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenRoom]; //进房并弹出礼物面板 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenRoomForGiftId]; ///进入聊天 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenChatPage]; ///进入聊天并关注 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenAppConcernedChat]; ///分享及保存 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSSavePictureShare]; ///兑换金币 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSGoToExchangeGold]; ///周卡内购 [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPayment]; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPaymentCallback]; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSVerifyCaptchaCallBack]; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSShowShareCallBack]; } return _pi_userContentController; } -(XPWebViewNavView *)navView{ if (!_navView){ _navView = [[XPWebViewNavView alloc]initWithFrame:CGRectZero]; _navView.delegate = self; } return _navView; } @end