美文网首页iOS点点滴滴
学习-WebKit(WKScriptMessageHandle

学习-WebKit(WKScriptMessageHandle

作者: F麦子 | 来源:发表于2017-09-21 17:26 被阅读802次

    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

    相关文章

      网友评论

        本文标题: 学习-WebKit(WKScriptMessageHandle

        本文链接:https://www.haomeiwen.com/subject/ikltextx.html