WKWebView添加JS交互后释放问题

660 阅读1分钟

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: 推荐

在合适的时机removejs方法即可
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")