WKWebView 与 JS 交互及对象无法释放问题记录
2019-07-20 本文已影响0人
黑羽肃霜
弄清 JS 注入、JS 和原生约定接口的区别
从顺序上,应该先介绍 JS
和 原生约定接口
JS 和 原生约定接口
这个比较好理解。WK
这边定义一个函数,然后和 JS
约定好,JS
通过调用形如下面的方法来调用/通知原生。
window.webkit.messageHandlers.函数名.postMessage({
'参数1': 'xxxxxx',
'参数2': 'xxxxxx'
});
而原生这边,WK
提供了 一个方法,可以配置桥接的内容。方便建立连接
let wkConfig = WKWebViewConfiguration()
let wkUserContentController = WKUserContentController()
wkUserContentController.add(self as WKScriptMessageHandler, name: "函数名")
let config = webView.configuration.userContentController
config.add(self as WKScriptMessageHandler, name: "loginCallback")
wkConfig.userContentController = wkUserContentController
个人简单的理解是:有一个网页,我们自己写一段 JS 注入到网页中去. 这段 JS 中包含有自己
注入 JS 后当前页面无法被释放的问题
简而言之,问题出在
wkUserContentController.add(self as WKScriptMessageHandler, name: "函数名")
这里将注入 JS
的 handler
设为 self
,之后 self
就一直被持有而不会被释放。如果我们继续添加其他的 JS 接口,就会报错。
解决的方法,简而言之,是另外建一个类作为 handler 而不是用 self。在那个类中实现对应的 JS delegate
方法