使用 wkWebView 打开 URL 和深层链接,但不通过 safari

问题描述 投票:0回答:2

这是关于 wkWebview 的。我想在我的应用程序中使用 wkWebView 来完成浏览互联网的整个操作,当涉及到深层链接时,我希望它检查手机中的应用程序并打开它(如果可用)。我知道我们可以使用 UIApplication.shared.canOpenURL 和 open 方法,但我想如果我使用这些方法,它将首先打开 safari,然后让 safari 完成深层链接的工作。在这种情况下,我根本不想涉及野生动物园。所以各位,你们能帮我吗?当我使用 canOpenURL 和 Open 方法时,有什么方法可以排除 safari 吗?

safari swift4 wkwebview xcode10
2个回答
2
投票

就我而言,我通过检查方案成功实现了这一目标。我意识到,当网址以“https/http”开头时,如果我们的手机中没有该应用程序,它将尝试打开 safari。这就是我想要防止的,这就是为什么我首先检查该方案的原因。这样,当 url 包含 http/https 时,它将保留在 wkwebview 上。我用这种方法成功地实现了我的目标,但我总是乐于接受任何建议或改进。

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

        if let url = navigationAction.request.url, let scheme = url.scheme?.lowercased() {
            //check the url scheme to bring user to specific apps other than safari

            if scheme != "https" && scheme != "http" {
                if UIApplication.shared.canOpenURL(url){
                    // use the available apps in user's phone
                    UIApplication.shared.open(url)
                } 
            }
        }
    decisionHandler(.allow)
}

0
投票

设置WkWebView委托:

 webView.uiDelegate = self
 webView.navigationDelegate = self

然后实现以下方法。

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if navigationAction.navigationType == .linkActivated  {
            if let url = navigationAction.request.url,
                let host = url.host, !host.hasPrefix("something whatever you want to handle deeplink"),
                UIApplication.shared.canOpenURL(url) {
                print(url)
                print("No need to open it locally")
                decisionHandler(.cancel)
            } else {
                print("Open it locally")
                decisionHandler(.allow)
            }
        } else {
            print("not a user click")
            decisionHandler(.allow)
        }
    }

如果您有任何疑问,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.