hyperlink - 在 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 中打开链接?
解决方案
- 看起来
https
WKWebView 目前只接受协议。如果你有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
网址类似的问题。
为了绕过这些问题,我将代码修改为以下内容:
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 中打开的。不幸的是,这是我目前能想到的最好的。
推荐阅读
- r - 如何在 r 中导入排列好的 .csv 文件
- python - 如何使用我正在使用的代码使球从绘制的矩形上反弹?
- angular - 'Could not resolve module... relative to...' 编译应用程序时出错
- python - 用我自己的操作系统刷新我的旧捕获盒
- java - 似乎无法将 int 转换为字符串并运行我的程序,因此它输出 330
- python-3.x - 内存问题?如何有效地获得所需的输出?
- php - Laravel 5.8 自定义表单请求未按预期工作?
- ruby-on-rails - 如何根据创建的对象字段值测试是否发送邮件
- c# - 使用 linq 过滤器选择父母和一些孩子
- swift - kitura中可编码路线中的多个参数