学习-WebKit(WKScriptMessageHandler)

WebKit(展示Web界面)

WebKit(WKScriptMessageHandler)

WebKit(WKUIDelegate)

WebKit(WKNavigationDelegate)

WebKit(刷新)

WebKit(导航)

WebKit(浏览记录)

WebKit(进度条)

上一篇博文《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方法。

其他

源代码

Objective-C

参考资料

WebKit Framework Reference

WKWebView的新特性与使用

WKWeb​View

CSDN:http://blog.csdn.net/y550918116j

GitHub:https://github.com/937447974/Blog

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    CoderLF阅读 9,442评论 2赞 12
  • 1、加载网页 WKWebView *webView = [[WKWebView alloc] initWithFr...
    LearningCoding阅读 3,316评论 0赞 2
  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    Dark_Angel阅读 29,655评论 67赞 291
  • 最近整理了一下原生与H5之间的交互方式,简单的做个总结。OC端与JS的交互,大致有这几种:拦截协议、JavaScr...
    谈Xx阅读 31,438评论 41赞 75
  • 早上起来做饭,习惯性的切茄子,之前买的食材在冰箱放了两天,感觉茄子有点老,里面的颗粒特别明显,边切菜边在想,现在可...
    小哧阅读 481评论 0赞 0

友情链接更多精彩内容