在WKWebView中打开外部链接(非外部)。

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

我的应用程序包含在WKWebView中打开的HTML信息页面,其中包含一些超链接。这些页面过去可以使用,但在最近的iOS版本中却停止了工作,并出现了错误信息,其中包含以下词语

Could not create sandbox extension
Connection to daemon was invalidated

当我用以下代码应用WKNavigation委托时

extension InformationPageController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
        var policy =  WKNavigationActionPolicy.allow
        if navigationAction.navigationType == .linkActivated {
            //  Neither of commented lines below works! 
            //  webView.load(navigationAction.request)
            //  webView.loadHTMLString(navigationAction.request.url!.absoluteString, baseURL: nil)
            UIApplication.shared.openURL(navigationAction.request.url!)
            policy = .cancel
        }
        decisionHandler(policy)
    }
}

这些页面在外部浏览器中打开,但在应用程序中却无法打开。

有什么方法可以在同一个WKWebView中像以前一样打开链接?

hyperlink wkwebview
1个回答
0
投票
  1. 它看起来像只有 https 协议目前被WKWebView所接受。如果您刚刚 http,WKWebView会抱怨协议不安全,打不开。

当我把http-s改成https-s后,页面打开了,但AppStore页面却打不开。这就引出了另一个问题。

  1. 当URL地址以 https://apps.apple.com/...,iOS(但不是macOS)会将其重定向到 itms-appss://apps.apple.com/... 在AppStore应用中打开,导致WKWebView出现错误。Redirection to URL with a scheme that is not HTTP(S). 类似的问题 mailto urls。

为了绕过这些问题,我修改了以下代码。

extension InformationPageController: WKNavigationDelegate {
    static let disallowedUrlPrefixes = ["https://apps.apple.com", "mailto:"]

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

        var policy =  WKNavigationActionPolicy.allow

        if navigationAction.navigationType == .linkActivated,
            let url = navigationAction.request.url {
            let urlString = url.absoluteString
            if InformationPageController.disallowedUrlPrefixes.first(where:{urlString.starts(with: $0)}) != nil {
                UIApplication.shared.openURL(url)
                policy = .cancel
            }
        }

        decisionHandler(policy)
    }
}

现在,"麻烦 "的页面是用外部浏览器打开的,而其他所有页面都是在WKWebView中打开的。不幸的是,这是我目前能想到的最好的办法。

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