WebKit(WKScriptMessageHandler)
上一篇博文《WebKit(展示Web界面)》讲解了显示Web页面,这一篇博文将讲解使用WKScriptMessageHandler完成JS交互。
在WKWebView中OC和JS交互也非常简单,WebKit库中有个代理WKScriptMessageHandler就是专门来做交互的。
1 WKScriptMessageHandler
1.1 WKScriptMessageHandler协议
WKScriptMessageHandler其实就是一个遵循的协议,它能让网页通过JS把消息发送给OC。其中协议方法。
/*!@abstractInvokedwhena script messageisreceived from a webpage.@paramuserContentController The user content controller invoking the
delegate method.@parammessage The script message received.
*/
- (void)userContentController:(WKUserContentController *)userContentControllerdidReceiveScriptMessage:(WKScriptMessage *)message;
从协议中我们可以看出这里使用了两个类WKUserContentController和WKScriptMessage。WKUserContentController可以理解为调度器,WKScriptMessage则是携带的数据。
1.2 WKUserContentController
WKUserContentController有两个核心方法,也是它的核心功能。
1. - (void)addUserScript:(WKUserScript *)userScript;: js注入,即向网页中注入我们的js方法,这是一个非常强大的功能,开发中要慎用。
2. - (void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name;:添加供js调用oc的桥梁。这里的name对应WKScriptMessage中的name,多数情况下我们认为它就是方法名。
1.3 WKScriptMessage
WKScriptMessage就是js通知oc的数据。其中有两个核心属性用的很多。
1. @property (nonatomic, readonly, copy) NSString *name;:对应- (void)addScriptMessageHandler:(id )scriptMessageHandler name:(NSString *)name; 添加的name。
2. @property (nonatomic, readonly, copy) id body;:携带的核心数据。
js调用时只需
window.webkit.messageHandlers..postMessage()
这里的name就是我们添加的name,是不是感觉很爽,就是这么简单,下面我们就来具体实现。
2 JS调用OC
2.1 配置WKUserContentController
要想使用WKUserContentController为web页面添加桥梁,只需配置到WKWebViewConfiguration即可。
下面改造webView方法。
2.2 实现WKScriptMessageHandler
在当前页面引入WKScriptMessageHandler,并实现WKScriptMessageHandler协议即可。
2.3 改造index.html页面
修改index.html的onClickButton()方法。
这里我们为了测试效果传入了一个复杂的字典数据,而且字典中还有数组。input.value代表用户输入的数据。
这里使用了window.webkit.messageHandlers.jsCallOC.postMessage(dict);通知oc,jsCallOC这个属性就是前面我们通过WKUserContentController注入的。
2.4 测试交互
我们在viewDidLoad使用index.html页面完成测试。
运行项目后,在页面的输入框中输入相应信息,点击确定按钮。即可在xcode中看见相关打印信息。
3 OC调用JS
3.1 OC通知JS
oc调用js就特别简单了,只需WKWebView调用
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ __nullable)(__nullable id, NSError * __nullable error))completionHandler;方法即可。
在上面的打印信息中,我们会发现我们还没有实现jsCallOC:方法,接下来我们在jsCallOC:方法中实现通知JS,并将用户输入的信息发送给JS。
3.2 JS响应
OC将通知发送给JS后,JS要响应这个ocCallJS方法。我们在index.html中的onClickButton()方法下添加ocCallJS方法。
//WKWebView调用JS
function ocCallJS(params){
show.innerHTML = params;
}
运行项目,在输入框输入信息后,点击确定按钮,会发现输入的信息在输入框下面显示出来。如图所示。
并在控制台看见如下打印信息。
4 WKUserScript JS注入
4.1 WKUserScript核心方法
在WebKit框架中,我们还可以预先添加JS方法,供其他人员调用。WKUserScript就是帮助我们完成JS注入的类,它能帮助我们在页面填充前或js填充完成后调用。核心方法。
4.2 WKUserScriptInjectionTime枚举
在WKUserScriptInjectionTime枚举中有两个状态。
WKUserScriptInjectionTimeAtDocumentStart:js加载前执行。
WKUserScriptInjectionTimeAtDocumentEnd:js加载后执行。
4.3 js注入
WKUserScript的运行需依托WKUserContentController,接下来我们就为WKWebView注入一个js执行完毕后执行的alert方法。
改造- (WKWebView *)webView方法。
其他