美文网首页
WKWebView 与 JS 交互及对象无法释放问题记录

WKWebView 与 JS 交互及对象无法释放问题记录

作者: 黑羽肃霜 | 来源:发表于2019-07-20 23:10 被阅读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: "函数名")

这里将注入 JShandler 设为 self,之后 self 就一直被持有而不会被释放。如果我们继续添加其他的 JS 接口,就会报错。

解决的方法,简而言之,是另外建一个类作为 handler 而不是用 self。在那个类中实现对应的 JS delegate 方法

相关文章

网友评论

      本文标题:WKWebView 与 JS 交互及对象无法释放问题记录

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