[iOS]解决使用WKScriptMessageHandler与JS交互时的内存泄露问题

在使用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")

即可!

推荐阅读更多精彩内容