Swift WkWebView不加载指向PDF的链接
WKWebView未加载链接。我正在将用户链接到隐私政策页面,该页面有一组链接。这些链接都是wix托管的PDF。在safari和Chrome上可以工作,但在WKWebView上不行。当页面加载时,您单击链接,我只得到一个错误:Swift WkWebView不加载指向PDF的链接,swift,wkwebview,Swift,Wkwebview,WKWebView未加载链接。我正在将用户链接到隐私政策页面,该页面有一组链接。这些链接都是wix托管的PDF。在safari和Chrome上可以工作,但在WKWebView上不行。当页面加载时,您单击链接,我只得到一个错误: Unknown result for URL 0x28157d110 (https) 这就是我加载web视图的方式 webView.load(URLRequest(url: URL(string: "https://mywebsite.io/legal")!)) 编辑
Unknown result for URL 0x28157d110 (https)
这就是我加载web视图的方式
webView.load(URLRequest(url: URL(string: "https://mywebsite.io/legal")!))
编辑:这是因为我没有下载pdf的意图-我只想以Safari相同的方式显示它
编辑:我刚刚用UIWebView(已弃用)替换了WKWebView,并加载了PDF。问题在于WKWebView。PDF是支持ssl的https->
let req = URLRequest(url: URL(string: "https://mywebsite.io/legal")!)
legacyWebView.loadRequest(req)
编辑:这里有一个页面建议你在打开pdf之前必须知道链接URL,但我不认为这是真的
编辑:我实现了两个委托方法,包括@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的决策:
// WKNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}
如果有帮助,那么就让该功能更精细化,即只为PDF启用哪些导航,而不是世界上的所有导航。您可以检查以下几点:
允许任意加载
选项更新应用程序传输安全设置
didMoveToParentViewController:
中的视图层次结构后才启动加载请求,因为如果javascript尝试在视图层次结构之外运行,可能会导致javascript失败WKNavigationActionPolicyAllow
我仍然不知道真正的原因是什么,但当我将文件的宿主从Wix更改为S3时,我不再遇到问题。首先,您应该将此添加到您的代理中:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(WKNavigationActionPolicy.allow)
}
如果链接有target=“\u blank”
很可能,您正在锚定标记中使用target=“\u blank”。这将打开一个新窗口以显示链接。WKWebView正在阻止您尝试打开新窗口(至少在默认情况下) 下面的代码仍然不会创建新窗口,而是在当前WKWebView中打开PDF等链接。 另一个选项似乎是创建一个新的WKWebView并返回它,这样ios就可以在其中打开链接。我不希望每次点击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;
}
}
扩展视图控制器:WKUIDelegate{
/**
*强制所有弹出窗口保留在当前WKWebView中。
*默认情况下,WKWebView阻止创建新窗口
*前。
*此代码捕获这些弹出窗口并将其显示在当前的WKWebView中。
*/
func webView(webView:WKWebView,createWebViewWith配置:WKWebViewConfiguration,用于导航操作:WKNavigationAction,windowFeatures:WKWindowFeatures)->WKWebView{
//在当前视图中打开
加载(navigationAction.request)
//不要返回新视图来构建弹出窗口(默认行为)。
返回零;
}
}
可能重复@KirilS。我不是想下载它们,我只是想像safari那样显示它们,除非这是你的意思。它给了你一系列关于它可能是什么的想法,例如,我会花钱让你尝试从http下载PDF,而你的URL是https(见其中一个回复)。WebView不喜欢这样的东西,两者都是https。如果你试图放松权限,例如设置NSAllowsArbitraryLoads
或相关密钥nsAllowsArbitraryLoadsWebContent
,如果它起作用,将证明这些链接的安全性中的某些东西不正确,意味着在其他方向查看有时这是多种因素的组合,如果链接被放置为目标\u blank
或在HTML链接中使用下载
关键字。即使我的URL没有target=“\u blank”,我的WKWebview仍不会将其加载到位。实现此委托后,一切都按预期进行。谢谢!第二是我的问题!回到一个老项目,我相信它以前是有效的。但是现在使用XCode 12和WKWebView页面上的链接进行构建时,如果不长按,将无法打开!切换到HTTPS解决了这个问题!
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;
}
}