Skip to content

Commit 251ebff

Browse files
committed
fix bridge leaks
1 parent eb571ef commit 251ebff

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

WKWebViewJavascriptBridge/WKWebViewJavascriptBridge.swift

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@ public class WKWebViewJavascriptBridge: NSObject {
2020
public init(webView: WKWebView) {
2121
super.init()
2222
self.webView = webView
23-
self.webView?.configuration.userContentController.add(self, name: iOS_Native_InjectJavascript)
24-
self.webView?.configuration.userContentController.add(self, name: iOS_Native_FlushMessageQueue)
2523
base = WKWebViewJavascriptBridgeBase()
2624
base.delegate = self
25+
addScriptMessageHandlers()
2726
}
2827

28+
deinit {
29+
removeScriptMessageHandlers()
30+
}
31+
32+
// MARK: - Public Funcs
2933
public func reset() {
3034
base.reset()
3135
}
@@ -42,7 +46,8 @@ public class WKWebViewJavascriptBridge: NSObject {
4246
base.send(handlerName: handlerName, data: data, callback: callback)
4347
}
4448

45-
func flushMessageQueue() {
49+
// MARK: - Private Funcs
50+
private func flushMessageQueue() {
4651
webView?.evaluateJavaScript("WKWebViewJavascriptBridge._fetchQueue();") { (result, error) in
4752
if error != nil {
4853
print("WKWebViewJavascriptBridge: WARNING: Error when trying to fetch data from WKWebView: \(String(describing: error))")
@@ -52,6 +57,16 @@ public class WKWebViewJavascriptBridge: NSObject {
5257
self.base.flush(messageQueueString: resultStr)
5358
}
5459
}
60+
61+
private func addScriptMessageHandlers() {
62+
webView?.configuration.userContentController.add(LeakAvoider(delegate: self), name: iOS_Native_InjectJavascript)
63+
webView?.configuration.userContentController.add(LeakAvoider(delegate: self), name: iOS_Native_FlushMessageQueue)
64+
}
65+
66+
private func removeScriptMessageHandlers() {
67+
webView?.configuration.userContentController.removeScriptMessageHandler(forName: iOS_Native_InjectJavascript)
68+
webView?.configuration.userContentController.removeScriptMessageHandler(forName: iOS_Native_FlushMessageQueue)
69+
}
5570
}
5671

5772
extension WKWebViewJavascriptBridge: WKWebViewJavascriptBridgeBaseDelegate {
@@ -71,3 +86,18 @@ extension WKWebViewJavascriptBridge: WKScriptMessageHandler {
7186
}
7287
}
7388
}
89+
90+
class LeakAvoider: NSObject {
91+
weak var delegate: WKScriptMessageHandler?
92+
93+
init(delegate: WKScriptMessageHandler) {
94+
super.init()
95+
self.delegate = delegate
96+
}
97+
}
98+
99+
extension LeakAvoider: WKScriptMessageHandler {
100+
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
101+
delegate?.userContentController(userContentController, didReceive: message)
102+
}
103+
}

WKWebViewJavascriptBridge/WKWebViewJavascriptBridgeBase.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import Foundation
1010

11-
@available(iOS 9.0, *)
1211
protocol WKWebViewJavascriptBridgeBaseDelegate: AnyObject {
1312
func evaluateJavascript(javascript: String)
1413
}

0 commit comments

Comments
 (0)