在 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 是不是支持加载外部 javascript 文件?