在开发中,我们需要的不仅仅是加载html就行了,还需要和js进行交互,怎么实现交互的呢 ? demo下载
1、通过拦截的方法进行交互
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
LHLog(@"在发送请求之前,决定是否跳转");
//这句是必须加上的,不然会异常
decisionHandler(WKNavigationActionPolicyAllow);
NSURL *requestURL = navigationAction.request.URL;
LHLog(@"%@",requestURL.absoluteString);
if ( [[requestURL scheme] isEqualToString:@"http"]) {
//实现代码 做相应的操作
return;
}
//例如下面的跳转
if ( [[requestURL scheme] isEqualToString:@"nwvr"]) {
PublicHttpViewController * public = [[PublicHttpViewController alloc] init];
[self.navigationController pushViewController:public animated:YES];
return;
}
}
2、js调用原生的方法进行交互
-
首先继承WKScriptMessageHandler 代理
-
然后创建WKWebView的时候
// 进行配置控制器
WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc] init];
// 调用原生的方法
[configuration.userContentController addScriptMessageHandler:self
name:@“uploadPersonImage”]; //uploadPersonImage 就是原生的方法名字
例子 :- (WKWebView *)webView { if (!_webView) { // 进行配置控制器 WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; // 实例化对象 configuration.userContentController = [WKUserContentController new]; // 调用原生的方法 [configuration.userContentController addScriptMessageHandler:self name:@"uploadPersonImage"]; // window.webkit.messageHandlers.uploadPersonImage.postMessage({body: 'goodsId=1212'}); js调用 // 进行偏好设置 WKPreferences *preferences = [WKPreferences new]; preferences.javaScriptEnabled = YES; preferences.javaScriptCanOpenWindowsAutomatically = YES; preferences.minimumFontSize = 40.0; configuration.preferences = preferences; _webView = [[WKWebView alloc] initWithFrame:RECT(0, heightWebView, SCREENWIDTH, SCREENHEIGHT- heightWebView) configuration:configuration]; _webView.navigationDelegate = self; _webView.opaque = NO; _webView.backgroundColor = [UIColor whiteColor]; if (@available(ios 11.0,*)){ _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;} } return _webView; }
-
js中调用 如果message.body中没有参数,JS代码中需要传null防止iOS端接收不到JS的交互。
window.webkit.messageHandlers.uploadPersonImage.postMessage({body: 'goodsId=1212'}); //js调用
-
实现代理
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:@"uploadPersonImage"]) { } }
3、原生调用js方法 (加载完成才能执行)
NSString * jsString =[NSString stringWithFormat:@"sendKey('%@')",@"参数"];
[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
//此处可以打印error.
}];