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

Cannot use custom scheme in embedded web view #1163

Closed
alekop opened this issue Oct 19, 2021 · 4 comments
Closed

Cannot use custom scheme in embedded web view #1163

alekop opened this issue Oct 19, 2021 · 4 comments

Comments

@alekop
Copy link

alekop commented Oct 19, 2021

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
Copy link
Author

alekop commented Oct 19, 2021

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
Copy link
Author

alekop commented Oct 20, 2021

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
Copy link
Contributor

I saw this issue with schemes, which had the same behavior: #1223 (comment)

@breautek
Copy link
Contributor

Closing this as a duplicate of #1163

Favouring #1163 because it seems more progressed and it's a more recent reported ticket.

@breautek breautek closed this as not planned Won't fix, can't repro, duplicate, stale Oct 21, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants