首页 > 解决方案 > 在 WKWebView 中打开外部链接(不是外部)

问题描述

我的应用程序包含在 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 中打开链接?

标签: hyperlinkwkwebview

解决方案


  1. 看起来httpsWKWebView 目前只接受协议。如果你有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网址类似的问题。

为了绕过这些问题,我将代码修改为以下内容:

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 中打开的。不幸的是,这是我目前能想到的最好的。


推荐阅读