From bc3c194d99151e611845fb0cd7be121aba8995e2 Mon Sep 17 00:00:00 2001 From: Hamzah Tossaro Date: Fri, 28 Jun 2024 02:40:00 +0700 Subject: [PATCH 1/3] feat: add webview callback --- .../Capacitor/CAPBridgeViewController.swift | 13 ++++++++++++- .../Capacitor/WebViewDelegationHandler.swift | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ios/Capacitor/Capacitor/CAPBridgeViewController.swift b/ios/Capacitor/Capacitor/CAPBridgeViewController.swift index 37ef75c4d7..27ca841574 100644 --- a/ios/Capacitor/Capacitor/CAPBridgeViewController.swift +++ b/ios/Capacitor/Capacitor/CAPBridgeViewController.swift @@ -8,7 +8,7 @@ import Cordova return capacitorBridge } - public fileprivate(set) var webView: WKWebView? + @objc public fileprivate(set) var webView: WKWebView? public var isStatusBarVisible = true public var statusBarStyle: UIStatusBarStyle = .default @@ -27,6 +27,11 @@ import Cordova return false }() + public var didStartProvisionalNavigationCallback: (() -> Void)? = nil + public var didFinishCallback: (() -> Void)? = nil + public var didFailCallback: (() -> Void)? = nil + public var didFailProvisionalNavigationCallback: (() -> Void)? = nil + override public final func loadView() { // load the configuration and set the logging flag let configDescriptor = instanceDescriptor() @@ -41,7 +46,13 @@ import Cordova let assetHandler = WebViewAssetHandler(router: router()) assetHandler.setAssetPath(configuration.appLocation.path) assetHandler.setServerUrl(configuration.serverURL) + let delegationHandler = WebViewDelegationHandler() + delegationHandler.didStartProvisionalNavigationCallback = didStartProvisionalNavigationCallback + delegationHandler.didFinishCallback = didFinishCallback + delegationHandler.didFailCallback = didFailCallback + delegationHandler.didFailProvisionalNavigationCallback = didFailProvisionalNavigationCallback + prepareWebView(with: configuration, assetHandler: assetHandler, delegationHandler: delegationHandler) view = webView // create the bridge diff --git a/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift b/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift index bf542c003c..a7c66ba3c3 100644 --- a/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift +++ b/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift @@ -17,6 +17,11 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat private let handlerName = "bridge" + var didStartProvisionalNavigationCallback: (() -> Void)? = nil + var didFinishCallback: (() -> Void)? = nil + var didFailCallback: (() -> Void)? = nil + var didFailProvisionalNavigationCallback: (() -> Void)? = nil + override public init() { super.init() contentController.add(self, name: handlerName) @@ -45,6 +50,9 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat open func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { // Reset the bridge on each navigation bridge?.reset() + if callback = didStartProvisionalNavigationCallback { + callback() + } } @available(iOS 15, *) @@ -128,6 +136,9 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat webViewLoadingState = .subsequentLoad } CAPLog.print("⚡️ WebView loaded") + if callback = didFinishCallback { + callback() + } } // The force unwrap is part of the protocol declaration, so we should keep it. @@ -144,6 +155,9 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat CAPLog.print("⚡️ WebView failed to load") CAPLog.print("⚡️ Error: " + error.localizedDescription) + if callback = didFailCallback { + callback() + } } // The force unwrap is part of the protocol declaration, so we should keep it. @@ -155,6 +169,9 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat CAPLog.print("⚡️ WebView failed provisional navigation") CAPLog.print("⚡️ Error: " + error.localizedDescription) + if callback = didFailProvisionalNavigationCallback { + callback() + } } open func webViewWebContentProcessDidTerminate(_ webView: WKWebView) { From c58b720cf02e80942ba923895c7a24e312928d39 Mon Sep 17 00:00:00 2001 From: Hamzah Tossaro Date: Fri, 28 Jun 2024 03:19:30 +0700 Subject: [PATCH 2/3] fix: missing let --- ios/Capacitor/Capacitor/WebViewDelegationHandler.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift b/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift index a7c66ba3c3..e0e323c125 100644 --- a/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift +++ b/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift @@ -50,7 +50,7 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat open func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { // Reset the bridge on each navigation bridge?.reset() - if callback = didStartProvisionalNavigationCallback { + if let callback = didStartProvisionalNavigationCallback { callback() } } @@ -136,7 +136,7 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat webViewLoadingState = .subsequentLoad } CAPLog.print("⚡️ WebView loaded") - if callback = didFinishCallback { + if let callback = didFinishCallback { callback() } } @@ -155,7 +155,7 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat CAPLog.print("⚡️ WebView failed to load") CAPLog.print("⚡️ Error: " + error.localizedDescription) - if callback = didFailCallback { + if let callback = didFailCallback { callback() } } @@ -169,7 +169,7 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat CAPLog.print("⚡️ WebView failed provisional navigation") CAPLog.print("⚡️ Error: " + error.localizedDescription) - if callback = didFailProvisionalNavigationCallback { + if let callback = didFailProvisionalNavigationCallback { callback() } } From 1cce74a066853a679ac82ad6586207217de3cae8 Mon Sep 17 00:00:00 2001 From: Hamzah Tossaro Date: Fri, 28 Jun 2024 03:58:27 +0700 Subject: [PATCH 3/3] fix: change var to func --- ios/Capacitor/Capacitor/CAPBridgeViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/Capacitor/Capacitor/CAPBridgeViewController.swift b/ios/Capacitor/Capacitor/CAPBridgeViewController.swift index 27ca841574..e9450d4b5b 100644 --- a/ios/Capacitor/Capacitor/CAPBridgeViewController.swift +++ b/ios/Capacitor/Capacitor/CAPBridgeViewController.swift @@ -27,10 +27,10 @@ import Cordova return false }() - public var didStartProvisionalNavigationCallback: (() -> Void)? = nil - public var didFinishCallback: (() -> Void)? = nil - public var didFailCallback: (() -> Void)? = nil - public var didFailProvisionalNavigationCallback: (() -> Void)? = nil + open func didStartProvisionalNavigationCallback(){} + open func didFinishCallback(){} + open func didFailCallback(){} + open func didFailProvisionalNavigationCallback(){} override public final func loadView() { // load the configuration and set the logging flag