在 WKWebView 中打开外部链接(不是外部)

Posted

技术标签:

【中文标题】在 WKWebView 中打开外部链接(不是外部)【英文标题】:Opening external links in WKWebView (not externally) 【发布时间】:2020-06-17 00:00:54 【问题描述】:

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

【问题讨论】:

【参考方案1】:
    WKWebView 目前似乎只接受https 协议。如果你只有http,WKWebView 会抱怨不安全的协议并且不会打开。

在我将 http-s 更改为 https-s 后,页面打开了,但 AppStore 页面没有打开。这导致了另一个问题。

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

【讨论】:

【参考方案2】:

可能是因为默认情况下 iOS 应用不允许 http 请求。尝试通过添加“App Transport Security Settings”并添加子键“Allow Arbitrary Loads”并在应用程序的 info.plist 中将其设置为 true:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

【讨论】:

以上是关于在 WKWebView 中打开外部链接(不是外部)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 WKWebView 在 Safari 中打开外部链接

WKWebView 不会打开外部链接

UIWebView 和 WKWebView 导航

WKWebView 是不是支持加载外部 javascript 文件?

WKWebview 在 macOS 上的默认浏览器中打开目标 =“_blank”链接

外部JS可以在iOS WkWebView中的加载页面(完成时)上执行吗