iOS WKWebView与H5交互,监听页面URL变化、接收H5传值、传值给H5。

mac2024-05-09  6

#define URL_define @"URL" // 添加监听当前url -(void)addwebViewKVOUrl { [self.webview addObserver:self forKeyPath:URL_define options:NSKeyValueObservingOptionNew context:nil]; } // KVO 方法 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { if ([keyPath isEqualToString:@"URL"]) { NSLog(@" 当前 URL------%@",self.webview.URL.absoluteString); } } -(void)removeWebViewKVOUrl { [self.webview removeObserver:self forKeyPath:URL_define]; } // ---------------------接收前端参数---------------------- /// 添加 js 接收消息方法 /// 前端 发消息给客户端方法 window.webkit.messageHandlers.与后台约定的方法名.postMessage(传的参数); /// @param name 方法名 与前端协商好一个字符串 就可以了 -(void)addJSMessageFromName:(NSString *)name { [self.webview.configuration.userContentController addScriptMessageHandler:self name:name]; } /* 接收H5 消息的方法 需要指定 WKScriptMessageHandler 代理 */ -(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message { NSLog(@"h5 name %@",message.name); NSLog(@"h5 body %@",message.body); } -(void)removeJSMessageFromName:(NSString *)name { [self.webview.configuration.userContentController removeScriptMessageHandlerForName:name]; } // ----------------- 给前端发消息 ------------------------- -(void)sendMessageToJSFromNme:(NSString *)name data:(id)data { NSString * jsStr = [NSString stringWithFormat:@"%@('%@')",name,data]; [self.webview evaluateJavaScript:jsStr completionHandler:^(id _Nullable response, NSError * _Nullable error) { if (!error) { NSLog(@"成功 = %@",response); } else { NSLog(@"失败 = %@",error.localizedDescription); } }]; } -(WKWebView *)webview{ if (!_webview) { WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.selectionGranularity = WKSelectionGranularityDynamic; config.allowsInlineMediaPlayback = YES; WKPreferences *preferences = [WKPreferences new]; preferences.javaScriptEnabled = YES; preferences.javaScriptCanOpenWindowsAutomatically = YES; config.preferences = preferences; CGRect frem = self.view.frame; WKWebView * webview = [[WKWebView alloc] initWithFrame:frem configuration:config]; webview.navigationDelegate = self; webview.UIDelegate = self; _webview = webview; } return _webview; } // ------------------ 调用 ------------------------- #define MessageName @"resiveMessage" -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self addwebViewKVOUrl]; [self addJSMessageFromName:MessageName]; } -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self removeWebViewKVOUrl]; [self removeJSMessageFromName:MessageName]; }

 

最新回复(0)