WkWebView 不加载 pdf 链接
WkWebView does not load links to pdfs
WKWebView 未加载 link。我正在 link 引导用户访问隐私政策页面,该页面有一组 link。 link 都是由 wix 托管的 pdf。在 safari 和 Chrome 上有效,但在 WKWebView 上无效。当页面加载并单击 links 时,我只收到一个错误:
Unknown result for URL 0x28157d110 (https)
这就是我加载网络视图的方式...
webView.load(URLRequest(url: URL(string: "https://mywebsite.io/legal")!))
编辑:这是 因为我无意下载 pdf - 我只是想以与 Safari 相同的方式显示它。
编辑:我刚刚将 WKWebView 替换为 UIWebView(已弃用)和 pdfs 加载。问题出在 WKWebView 上。 Pdfs 是支持 ssl 的 https ->
let req = URLRequest(url: URL(string: "https://mywebsite.io/legal")!)
legacyWebView.loadRequest(req)
编辑:这里有一个页面 建议您在打开 pdf 之前必须知道 link URL,但我不认为这是真的。
编辑:我实现了 2 个委托方法,包括下面@Kiril 建议的方法。 pdf 链接仍然打不开。
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(WKNavigationActionPolicy.allow)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
decisionHandler(WKNavigationResponsePolicy.allow)
}
我可以建议的一件事(不确定是否有帮助,但评论时间太长)是尝试实现 WKNavigationDelegate 的 decidePolicyFor
:
// WKNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}
如果有帮助,请使该功能更细化,即您需要为 PDF 启用哪些导航,而不是世界上所有其他内容。
您可以检查以下几项内容:
验证 <a href
links 不包含 target="_blank"
属性,因为 WKWebView 不知道如何打开 link一个新标签。请参阅 了解如何解决该问题。
检查 link 是否为 HTTPS 或使用 Allow Arbitrary Loads
选项更新 App Transport Security Settings
确保仅在将 WKWebView 添加到 didMoveToParentViewController:
中的视图层次结构后才启动加载请求,因为如果它尝试 [=] 可能会使 javascript 失败41=] 在视图层次之外
实施 WKWebView NavigationDelegate 方法并确保您 return WKNavigationActionPolicyAllow
在决定请求策略时
我仍然不知道真正的原因是什么,但是当我将文件的托管从 Wix 更改为 S3 时,我不再遇到这个问题。
首先,您应该将此添加到您的委托中:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(WKNavigationActionPolicy.allow)
}
那么如果link有target="_blank"
可能还需要实现下面的方法
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
您可能在锚标记中使用了 target="_blank"。这会打开一个新的 window 来显示 link。 WKWebView 正在阻止您尝试打开新的 window(至少在默认情况下)。
下面的代码仍然没有创建新的window,而是在当前WKWebView 中打开PDF 等link。
另一个选项似乎是创建一个新的 WKWebView 和 return 它,以便 ios 可以打开其中的 link。我不希望每次点击 WKWebView 内的网站都创建额外的视图。
在你的ViewController.viewDidLoad
webView.uiDelegate = self
然后为委托添加扩展
extension ViewController: WKUIDelegate {
/**
* Force all popup windows to remain in the current WKWebView.
* By default, WKWebView is blocking new windows from being created
* ex <a href="link" target="_blank">text</a>.
* This code catches those popup windows and displays them in the current WKWebView.
*/
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
// open in current view
webView.load(navigationAction.request)
// don't return a new view to build a popup into (the default behavior).
return nil;
}
}
WKWebView 未加载 link。我正在 link 引导用户访问隐私政策页面,该页面有一组 link。 link 都是由 wix 托管的 pdf。在 safari 和 Chrome 上有效,但在 WKWebView 上无效。当页面加载并单击 links 时,我只收到一个错误:
Unknown result for URL 0x28157d110 (https)
这就是我加载网络视图的方式...
webView.load(URLRequest(url: URL(string: "https://mywebsite.io/legal")!))
编辑:这是
编辑:我刚刚将 WKWebView 替换为 UIWebView(已弃用)和 pdfs 加载。问题出在 WKWebView 上。 Pdfs 是支持 ssl 的 https ->
let req = URLRequest(url: URL(string: "https://mywebsite.io/legal")!)
legacyWebView.loadRequest(req)
编辑:这里有一个页面
编辑:我实现了 2 个委托方法,包括下面@Kiril 建议的方法。 pdf 链接仍然打不开。
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(WKNavigationActionPolicy.allow)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
decisionHandler(WKNavigationResponsePolicy.allow)
}
我可以建议的一件事(不确定是否有帮助,但评论时间太长)是尝试实现 WKNavigationDelegate 的 decidePolicyFor
:
// WKNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}
如果有帮助,请使该功能更细化,即您需要为 PDF 启用哪些导航,而不是世界上所有其他内容。
您可以检查以下几项内容:
验证
<a href
links 不包含target="_blank"
属性,因为 WKWebView 不知道如何打开 link一个新标签。请参阅 了解如何解决该问题。检查 link 是否为 HTTPS 或使用
Allow Arbitrary Loads
选项更新App Transport Security Settings
确保仅在将 WKWebView 添加到
didMoveToParentViewController:
中的视图层次结构后才启动加载请求,因为如果它尝试 [=] 可能会使 javascript 失败41=] 在视图层次之外实施 WKWebView NavigationDelegate 方法并确保您 return
WKNavigationActionPolicyAllow
在决定请求策略时
我仍然不知道真正的原因是什么,但是当我将文件的托管从 Wix 更改为 S3 时,我不再遇到这个问题。
首先,您应该将此添加到您的委托中:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(WKNavigationActionPolicy.allow)
}
那么如果link有target="_blank"
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
您可能在锚标记中使用了 target="_blank"。这会打开一个新的 window 来显示 link。 WKWebView 正在阻止您尝试打开新的 window(至少在默认情况下)。
下面的代码仍然没有创建新的window,而是在当前WKWebView 中打开PDF 等link。 另一个选项似乎是创建一个新的 WKWebView 和 return 它,以便 ios 可以打开其中的 link。我不希望每次点击 WKWebView 内的网站都创建额外的视图。
在你的ViewController.viewDidLoad
webView.uiDelegate = self
然后为委托添加扩展
extension ViewController: WKUIDelegate {
/**
* Force all popup windows to remain in the current WKWebView.
* By default, WKWebView is blocking new windows from being created
* ex <a href="link" target="_blank">text</a>.
* This code catches those popup windows and displays them in the current WKWebView.
*/
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
// open in current view
webView.load(navigationAction.request)
// don't return a new view to build a popup into (the default behavior).
return nil;
}
}