cordova-ios icon indicating copy to clipboard operation
cordova-ios copied to clipboard

Cannot use custom scheme in embedded web view

Open alekop opened this issue 4 years ago • 2 comments

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 avatar Oct 19 '21 20:10 alekop

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 avatar Oct 19 '21 21:10 alekop

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??

alekop avatar Oct 20 '21 23:10 alekop

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

msmtamburro avatar Jun 26 '23 20:06 msmtamburro

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.

breautek avatar Oct 21 '23 11:10 breautek