WKWebView 和本地代码交互方式
来源:互联网 发布:铁三角msr7煲机 知乎 编辑:程序博客网 时间:2024/06/05 16:58
从iOS 8.0开始,应该使用WKWebView。
消息交互
WKWebView和本地程序的交互有3种方式:
第一种在WebView内容的特定加载阶段执行一段JS。
在WKWebView
的configuration
的usercontentController
中添加一个WKUserScript
。使用WKUserContentController
的addUserScript
方法,这个方法中可以指定JS代码执行的时机,目前只有WKUserScriptInjectionTimeAtDocumentStart
和WKUserScriptInjectionTimeAtDocumentEnd
两个选项。
NSString *jsCode = @"var s = document.createElement('style');" "s.textContent = '" "body { font-size: 40px;}; '" "\n" "document.documentElement.appendChild(s);\n";WKUserScript *script = [[WKUserScript alloc] initWithSource:jsCodeinjectionTime:WKUserScriptInjectionTimeAtDocumentStartforMainFrameOnly:YES];WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];config.userContentController = [[WKUserContentController alloc] init];[config.userContentController addUserScript:script];[config.userContentController addScriptMessageHandler: self name:@"playbutton”];
第二种方式是在任何时候,本地代码让WKWebView
执行一段JS。
直接在WKWebView
上执行evaluateJavaScript:completionHandler
。
NSString *jsCode = @"var s = document.createElement('style');" "s.textContent = '" "body { font-size: 40px;}; '" "\n" "document.documentElement.appendChild(s);\n";[self.webView evaluateJavaScript:jsCode completionHandler:^(id _Nullable, NSError * _Nullable error) {}];
第三种是WKWebView中HTML上执行JS代码向本地发送消息。
在WKWebView的configuration的usercontentController
中添加一个id<WKScriptMessageHandler>
。这是一个实现了WKScriptMessageHandler
接口的对象,这个接口只有一个方法:userContentController:didReceiveScriptMessage:
这个方法用于处理JS发送的消息。
HTML 中的代码如下:
<button style="width: 100px; height: 30px" onclick="window.webkit.messageHandlers.playbutton.postMessage('play')">点击</button>
id<WKScriptMessageHandler>
接口实现:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ NSLog(@"name: %@ content: %@", message.name, message.body);}
导航控制
和导航相关的API在WKWebView本身的接口和navigationDelegate上。
1.在WKWebView上有一个属性是loading,指示web内容是否在加载中,可以通过KVO的方式来获取加载完成事件。一般可以用来显示或者影藏loading的indicator。
[self.webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:nil];
2.WKWebView
本身的goBack
,goForward
,goToBackForwardListItem
可以被直接用来导航。
3.通过navigationDelegate来控制导航。
- (void)webView:(WKWebView *)webViewdecidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { //在跳转之前决定是否要继续 NSLog(@"decidePolicyForNavigationAction"); if(navigationAction.navigationType == WKNavigationTypeLinkActivated){ NSURL *url = navigationAction.request.URL; NSLog(@"will goto %@", url); } decisionHandler(WKNavigationActionPolicyAllow);}-(void)webView:(WKWebView *)webViewdecidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponsedecisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ //获取到response的Meta之后决定是否要继续 NSLog(@"decidePolicyForNavigationResponse");// NSLog(@"%@", navigationResponse.response.MIMEType); decisionHandler(WKNavigationResponsePolicyAllow);}-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ NSLog(@"didFinishNavigation");}...
navigationDeleagate的接口会在导航的对应阶段被调用,让接口的实现者来决定是否要继续导航,或者在这个时候做些别的事情。
被调用的顺序是:
2017-07-27 21:27:58.375656+0800 WebView[4978:1060161] decidePolicyForNavigationAction2017-07-27 21:27:58.377185+0800 WebView[4978:1060161] didStartProvisionalNavigation2017-07-27 21:27:58.480193+0800 WebView[4978:1060161] decidePolicyForNavigationResponse2017-07-27 21:27:58.488432+0800 WebView[4978:1060161] didCommitNavigation2017-07-27 21:27:58.670341+0800 WebView[4978:1060161] didFinishNavigation
参考文献
官方文档
- WKWebView 和本地代码交互方式
- WKWebView详解&WKWebVieW和JS交互
- WKWebView OC和JS交互
- WKWebView和UIWebView加载本地html和JS交互各种坑解决办法
- Android中WebView的JavaScript代码和本地代码交互的三种方式
- Android中WebView的JavaScript代码和本地代码交互的三种方式
- Android中WebView的JavaScript代码和本地代码交互的三种方式
- UIWebview和WKWebview的使用 js交互 本地加载 网络加载
- android webview & ios uiwebview和wkwebview的交互以及本地缓存
- WKWebView和UIWebView及其四种交互
- WKWebView 的使用(和js交互)
- WKWebView的OC和JS交互
- WebView的JavaScript与本地代码三种交互方式
- WebView的JavaScript与本地代码三种交互方式
- WebView的JavaScript与本地代码三种交互方式
- WebView的JavaScript与本地代码三种交互方式
- UIWebview和WKWebview加载本地html
- 使用WebView中的Javascript和本地代码交互
- editplus 快捷键
- Redis之Sentinel主从复制,读写分离,主从切换
- hdu 4006 优先队列
- Linux源码解析-信号机制相关数据结构
- 基础知识点巩固
- WKWebView 和本地代码交互方式
- 连续子数组的最大和
- Android 利用服务Service创建标题栏通知
- POJ 3370 Halloween treats(抽屉原理)
- ZOJ 2795 Ambiguous permutations 水~
- BAT及各大互联网公司前端笔试面试题--Html,Css篇(加上自我整理总结哟)
- 欢迎使用CSDN-markdown编辑器
- C++Primer Plus(第六版) 第十二章 第二题
- HDU-2389 Rain on your Parade(二分图之Hopcroft-Karp算法)