在 WKWebView 中打开外部链接(非外部)
Opening external links in WKWebView (not externally)
我的应用程序包含 HTML 个在 WKWebView 中打开的信息页面,其中包含一些超链接。这些曾经有效,但在最近的 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 中打开链接?
- 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
url 的类似问题。
为了绕过这些问题,我将代码修改为以下内容:
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: [=10=])}) != nil {
UIApplication.shared.openURL(url)
policy = .cancel
}
}
decisionHandler(policy)
}
}
现在 'troublesome' 页面使用外部浏览器打开,所有其他页面都在 WKWebView 中打开。不幸的是,这是我目前能想到的最好的。
可能是因为 iOS 应用默认不允许 http 请求。尝试通过添加“App Transport Security Settings”并添加子键“Allow Arbitrary Loads”来允许它,并在应用程序的 info.plist:
中将其设置为 true
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
我的应用程序包含 HTML 个在 WKWebView 中打开的信息页面,其中包含一些超链接。这些曾经有效,但在最近的 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 中打开链接?
- 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
url 的类似问题。
为了绕过这些问题,我将代码修改为以下内容:
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: [=10=])}) != nil {
UIApplication.shared.openURL(url)
policy = .cancel
}
}
decisionHandler(policy)
}
}
现在 'troublesome' 页面使用外部浏览器打开,所有其他页面都在 WKWebView 中打开。不幸的是,这是我目前能想到的最好的。
可能是因为 iOS 应用默认不允许 http 请求。尝试通过添加“App Transport Security Settings”并添加子键“Allow Arbitrary Loads”来允许它,并在应用程序的 info.plist:
中将其设置为 true<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>