IOS - 第二次单击相同按钮时,WKWebview 在决定策略中获取空 url

Posted

技术标签:

【中文标题】IOS - 第二次单击相同按钮时,WKWebview 在决定策略中获取空 url【英文标题】:IOS - WKWebview gets null url in decidePolicy when second clicking the same button 【发布时间】:2020-01-29 05:57:12 【问题描述】:

我有一个WKWebview,有一个下载pdf的按钮,按钮链接如下:

<a href="https://mysite.appiancloud.com/suite/rest/a/content/latest/igB-Xg0UyTkBidWeSJGldcpdb0wlYmynKQi_fRvbd5xpczwkJJXkcYS/o"><img class= src="$imageurl"></a>

我已经设法通过一定的逻辑下载了 PDF,该逻辑以decidePolicyFor 方法为起点:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 

        let url = navigationAction.request.url

        if openInDocumentPreview(url!) 
                decisionHandler(.cancel)
                executeDocumentDownloadScript(webView, forAbsoluteUrl: url!.absoluteString)

         else 
                decisionHandler(.allow)
        
    

这很好用,并且 url 是带有 PDF 的那个。但是,如果我再次单击该按钮,我只会收到 null 网址,因此我无法再次打开该文档。这是我收到的操作:

<WKNavigationAction: 0x102d95fa0; navigationType = -1; syntheticClickType = 0; position x = 0.00 y = 0.00 request = <NSMutableURLRequest: 0x282e151d0>  URL: about:blank ; sourceFrame = <WKFrameInfo: 0x102d502f0; webView = 0x103048200; isMainFrame = YES; request = <NSMutableURLRequest: 0x282e116d0>  URL: https://mysite.appiancloud.com/suite/sites/home >; targetFrame = <WKFrameInfo: 0x102d577a0; webView = 0x103048200; isMainFrame = NO; request = (null)>>

如果我在 Safari 桌面上对此进行测试,则每次都可以正常下载文件,但是我找不到 WKWebView 停止接收 url 的原因。没有调用其他委托方法,甚至没有调用 target="_blank" url 时往往会调用的 createWebViewWith

我想知道 WKWebview cachePolicy 是否正在生效,但是我找不到避免该 url 缓存的方法,或者如果它正在被缓存,则在尝试再次加载它时接收事件。

另外,请注意,如果我长按链接,预览元素会正确保存 URL。

【问题讨论】:

【参考方案1】:

好的,我的理论是通过告诉处理程序WKNavigationAction 策略是.cancel,将不会处理以下请求。

我所做的是在createWebViewWith方法中处理URL下载,并让策略始终为.allow

【讨论】:

以上是关于IOS - 第二次单击相同按钮时,WKWebview 在决定策略中获取空 url的主要内容,如果未能解决你的问题,请参考以下文章

第二次单击时取消选中单选按钮

无法制作双向按钮(第一次单击使问题在第二次启用时禁用)

第二次单击按钮,得到不同的结果

直到第二次单击(vb6),按钮事件才显示值

SQL Reporting Services报告仅在第二次单击时加载

单击右上角的关闭(x)按钮后,DOJO 对话框未第二次打开