diff --git a/ios/Capacitor/Capacitor/CAPBridgeViewController.swift b/ios/Capacitor/Capacitor/CAPBridgeViewController.swift index a7285213d..4d069b672 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 }() + 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 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 2b4a256d0..bdde4f6e1 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 let callback = didStartProvisionalNavigationCallback { + callback() + } } open func webView( @@ -126,6 +134,9 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat webViewLoadingState = .subsequentLoad } CAPLog.print("⚡️ WebView loaded") + if let callback = didFinishCallback { + callback() + } } // The force unwrap is part of the protocol declaration, so we should keep it. @@ -142,6 +153,9 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat CAPLog.print("⚡️ WebView failed to load") CAPLog.print("⚡️ Error: " + error.localizedDescription) + if let callback = didFailCallback { + callback() + } } // The force unwrap is part of the protocol declaration, so we should keep it. @@ -153,6 +167,9 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat CAPLog.print("⚡️ WebView failed provisional navigation") CAPLog.print("⚡️ Error: " + error.localizedDescription) + if let callback = didFailProvisionalNavigationCallback { + callback() + } } open func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {