我的应用程序包含在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中像以前一样打开链接?
https
协议目前被WKWebView所接受。如果您刚刚 http
,WKWebView会抱怨协议不安全,打不开。当我把http-s改成https-s后,页面打开了,但AppStore页面却打不开。这就引出了另一个问题。
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中打开的。不幸的是,这是我目前能想到的最好的办法。