Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(iOS): add webview callback #7537

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion ios/Capacitor/Capacitor/CAPBridgeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand All @@ -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
Expand Down
17 changes: 17 additions & 0 deletions ios/Capacitor/Capacitor/WebViewDelegationHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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()
}
}

@available(iOS 15, *)
Expand Down Expand Up @@ -128,6 +136,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.
Expand All @@ -144,6 +155,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.
Expand All @@ -155,6 +169,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) {
Expand Down