WKWebView添加JS交互
let configuration = WKWebViewConfiguration()
configuration.userContentController.add(self, name: "jsName1")
configuration.userContentController.add(self, name: "jsName2")
let webView = WKWebView(frame: view.bounds , configuration: configuration)
//正常业务逻辑,监听事件等
......
写完后,从webViewVC返回上一级页面,会发现webViewVC并不会释放 排除其他常见原因后发现是configuration.userContentController调用add( <#T##scriptMessageHandler: WKScriptMessageHandler##WKScriptMessageHandler#> , name: <#T##String#> ) 导致循环引用不能正常释放 解决办法:
方法1: 推荐
在合适的时机remove掉js方法即可
configuration.userContentController.removeScriptMessageHandler(forName: "jsName1")
configuration.userContentController.removeScriptMessageHandler(forName: "jsName1")
方法2: addScriptMessageHandler避免使用self
1、//创建WeakScriptMessageDelegate作为configuration.userContentController交互Handler
/// 作为 wkwebView的userContentController代理使用
class WeakScriptMessageDelegate: NSObject, WKScriptMessageHandler {
private weak var delegate: WKScriptMessageHandler?
init(delegate: WKScriptMessageHandler?) {
self.delegate = delegate
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
self.delegate?.userContentController(userContentController, didReceive: message)
}
}
2、添加交互事件
let jsDelegate =
configuration.userContentController.add(jsDelegate, name: "jsName1") configuration.userContentController.add(jsDelegate, name: "jsName2")
3、在合适的时机remove掉js方法即可
configuration.userContentController.removeScriptMessageHandler(forName: "jsName1")
configuration.userContentController.removeScriptMessageHandler(forName: "jsName1")