apache / cordova-ios

Apache Cordova iOS
https://cordova.apache.org/
Apache License 2.0
2.15k stars 987 forks source link

Cannot use custom scheme in embedded web view #1163

Closed alekop closed 8 months ago

alekop commented 2 years ago

Native SwiftUI app with embedded Cordova Web view. Loads fine using the file scheme, but I would like to use a custom scheme in order to establish a secure context. I've added the scheme and hostname preferences to config.xml file:

<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />

CDVWebViewEngine.pluginInitialize creates the scheme handler, and attaches it to the configuration:

self.schemeHandler = [[CDVURLSchemeHandler alloc] initWithVC:vc];
[configuration setURLSchemeHandler:self.schemeHandler forURLScheme:scheme];

Finally, CDVWebViewEngine.loadRequest calls WKWebView.loadRequest with "app://localhost/index.html"... But the CDVURLSchemeHandler.startURLSchemeTask method is never called, and the web view remains on about:blank. Tried setting location.href manually (via the Safari dev tools), but nothing loads.

The view controller is exposed to SwiftUI like so:

class CordovaWebViewController: CDVViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

struct CordovaWebView: UIViewControllerRepresentable {
    typealias UIViewControllerType = CordovaWebViewController

    func makeUIViewController(context: Context) -> CordovaWebViewController {
        CordovaWebViewController()
    }

    func updateUIViewController(_ uiViewController: CordovaWebViewController, context: Context) {
    }
}

And used like this:

struct ContentView: View {
    var body: some View {
        CordovaWebView()
    }
}

Is there anything extra I need to do for an embedded view?

alekop commented 2 years ago

I noticed that the web view is recreated:

// re-create WKWebView, since we need to update configuration
WKWebView* wkWebView = [[WKWebView alloc] initWithFrame:self.engineWebView.frame configuration:configuration];

Maybe SwiftUI is using the previous version.

alekop commented 2 years ago

After two days, I am no closer to a solution. I've tried starting with a regular HelloCordova app, and removing CDV delegates to isolate the "magic", but the damn thing still loads from app://localhost, while my app with the embedded webview just doesn't. WTF is the difference???

My app: [((WKWebView*)_engineWebView).configuration urlSchemeHandlerForURLScheme:@"app"] return non-null. Why isn't the delegate called then??

msmtamburro commented 1 year ago

I saw this issue with schemes, which had the same behavior: https://github.com/apache/cordova-ios/issues/1223#issuecomment-1608211672

breautek commented 8 months ago

Closing this as a duplicate of https://github.com/apache/cordova-ios/issues/1163

Favouring https://github.com/apache/cordova-ios/issues/1163 because it seems more progressed and it's a more recent reported ticket.