Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /