使用 WKWebView 的时候,如果想要实现 JS 调用iOS原生的方法,除了拦截URL之外,还有一种简单的方式,那就是利用 WKWebView 的新特性WKScriptMessageHandler 来实现 JS 调用原生方法
1.WKScriptMessageHandler 是什么
这是苹果文档的说明:
A class conforming to the WKScriptMessageHandler protocol provides a method for receiving messages from JavaScript running in a webpage.
WKScriptMessageHandler 是一个协议,这个协议提供一个方法可以接收 JS 传过来的消息,这个协议方法里面有两个类 WKScriptMessage
和 WKUserContentController
|
|
WKScriptMessage
就是 JS 传给 Swift 的消息,有两个主要属性:
|
|
WKUserContentController
可以理解为调度控制器,有两个主要的方法:
|
|
要使用 WKScriptMessageHandler
的功能,JS 需要这样调用:
|
|
2.使用WKScriptMessageHandler
WKWebView 有一个 WebViewConfiguration
类型的参数,而WKWebViewConfiguration
有一个属性叫userContentController
,它是WKUserContentController
类型的参数,我们就需要使用这个 userContentController
参数
WKWebView 实例化的时候配置 WKWebViewConfiguration
参数
|
|
为了防止循环引用无法释放控制器需要在 viewWillDisappear
里面移除 MessageHandler
|
|
3.实现协议方法
这里除了需要实现两个协议:WKUIDelegate, WKScriptMessageHandler
,实现WKUIDelegate
协议是因为 JS 里面需要 alert,实现 WKScriptMessageHandler
就是这篇文章需要讨论的 JS 调用 Swift 的原生方法,下面是实现协议的方法:
|
|
根据 WKScriptMessage
的关键属性 name 来区分执行不同的方法,body 中存着JS 要给 Swift 传的参数
这是 HTML 和 JS 部分代码:
|
|
|
|
4.JS和Swift的相互调用
我们来看一下 JS 调用 Swift 的 share
方法,这个方法里的参数就是来自 WKScriptMessage
的 body
属性:
|
|
Swift 调用 JS 的方法还是使用 WKWebview的 evaluateJavaScript
方法:
|
|
使用 WKScriptMessageHandler 的优点:
- 在 JS 中写起来简单,不用再用创建URL的方式那么麻烦
- JS 传递参数更方便,使用拦截URL的方式传递参数,只能把参数拼接在后面,如果遇到要传递的参数中有特殊字符,如&、=、?等,必须得转换,否则参数解析会出错,如下例子:
如果传递地址是这样的:
|
|
使用拦截 URL 的JS调用方式如下:
|
|
将上面的 url 放入链接地址这里后,根本无法区分share_uuid是其他参数,还是url里附带的参数,使用MessageHandler 就可以避免特殊字符引起的问题
原文地址: iOS下 JS 与 OC 互相调用(三)–MessageHandler
原文是讨论 OC 与 JS 的交互,我按照作者的思路,用 Swift 实现 Native 与 JS 的交互,这是 代码地址
本人刚开始写博客,主要是为了给自己的知识点做一个笔记,方便自己以后查阅,如果能让别人有所启发也是荣幸之至!如有错误,欢迎指正!