【问题标题】:Using wkWebView to open URL and deeplink but not via safari使用 wkWebView 打开 URL 和深度链接,但不通过 safari
【发布时间】:2019-09-30 15:29:41
【问题描述】:

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

【问题讨论】:

    标签: safari swift4 wkwebview xcode10


    【解决方案1】:

    就我而言,我通过检查方案设法实现了这一点。我意识到当 url 以“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)
    }
    

    【讨论】:

      【解决方案2】:

      设置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)
              }
          }
      

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

      【讨论】:

      • 谢谢,这帮助我得出了自己的答案。无论如何,我都会接受这个作为已接受的答案。
      • @Ketan,万一“print("无需在本地打开")”如果代码出现这种情况,那么它会调用appdelegate或sceneDelegate中的一些方法来打开deeplinks吗?赖特?
      • @DmitriyGrehsure 我去看看。
      猜你喜欢
      • 2015-08-16
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2014-03-11
      • 1970-01-01
      相关资源
      最近更新 更多