@@ -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
5772extension 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+ }
0 commit comments