在使用WKScriptMessageHandler与JS交互的时候会引起内存泄露, 为了解决此问题, 简单进行了封装, 代码不多, 直接给出:
//
// LQ.swift
// WKWebTest
//
// Created by Artron_LQQ on 2017/11/28.
// Copyright © 2017年 Artup. All rights reserved.
//
/*
解决使用 WKUserContentController 实例时的内存泄露问题:
将
let user = WKUserContentController()
// 向js中注入协议, 作为ios和js交互的依据
user.add(self, name: "appProtocol")
改为:
let user = WKUserContentController()
// 向js中注入协议, 作为ios和js交互的依据
user.add(LQScriptMessage.init(self), name: "appProtocol")
或者使用方法
user.addHandler(self, name: "appProtocol")
即可!
*/
import UIKit
import WebKit
class LQScriptMessage: NSObject, WKScriptMessageHandler {
weak var delegate: WKScriptMessageHandler?
init(_ delegate: WKScriptMessageHandler) {
super.init()
self.delegate = delegate
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
self.delegate?.userContentController(userContentController, didReceive: message)
}
}
extension WKUserContentController {
func addHandler(_ message: Any, name: String) {
if let msg = message as? WKScriptMessageHandler {
self.add(LQScriptMessage(msg), name: name)
}
}
}
使用的时候也很简单, 只需要将原先的使用方式:
let user = WKUserContentController()
// 向js中注入协议, 作为ios和js交互的依据
user.add(self, name: "appProtocol")
替换为:
let user = WKUserContentController()
// 向js中注入协议, 作为ios和js交互的依据
user.add(LQScriptMessage.init(self), name: "appProtocol")
或者直接使用WKUserContentController扩展里的自定义方法:
let user = WKUserContentController()
// 向js中注入协议, 作为ios和js交互的依据
user.addHandler(self, name: "appProtocol")
即可!