iOS 9 WKWebView 产生“加载资源失败:已取消”,而 iOS 8 没有
Posted
技术标签:
【中文标题】iOS 9 WKWebView 产生“加载资源失败:已取消”,而 iOS 8 没有【英文标题】:iOS 9 WKWebView yields "failed to load resource: cancelled" where iOS 8 doesn't 【发布时间】:2015-10-20 15:09:03 【问题描述】:我正在开发一个支持 ios 8 和 9 的应用,在我的应用中使用 WKWebView 获取一些视图。
我暂时将我的网站和子域列入了 ATS 的白名单(等待一些 SSL 证书更改)。所以我认为我要描述的内容与 ATS 无关,但谁知道呢。
我的本机代码在我的 WKWebView 中调用一个 javascript 函数,该函数使用 jQuery 触发 ajax GET 请求。
在 iOS 8 中,它每次都能正常工作。
在 iOS 9 中,它仅在某些时候有效。似乎不到一半的时间。
当我在我的 iPhone 连接到的桌面上使用 Safari 开发者控制台连接到 WKWebView 时,我能够看到这个错误:
Failed to load resource: cancelled
据我所知,甚至从未发出过网络请求。我已经盯着这个问题两天了,无法辨别为什么网络请求被“取消”。在某些情况下,我确实对我的 ajax 请求调用了 .abort(),但是当我诊断出这个问题时,我已经将所有这些都注释掉了。
有没有其他人在 iOS 9 中遇到过类似 iOS 8 中没有的任何新的 ajax 问题?
知道如何弄清楚什么是“取消”ajax 请求吗?我已经尝试了我能想到的所有调试技巧,但是调试 WKWebView ajax 并不是那么容易。
【问题讨论】:
你解决过这个问题吗?我也遇到了同样的问题。 @Nancy 检查我刚刚发布的答案。不知道它为什么对我们有用,我的猜测只是 ajax 请求被取消了,因为发起请求的控制器在请求时被解除(即使请求实际上是在另一个控制器中发生的.. .)。¯\_(ツ)_/¯
【参考方案1】:
我不能确定为什么下面的更改为我们解决了问题,但请尝试解释我们所做的工作,以便您了解它如何适用于其他地方。
我们正在通过MTBBarcodeScanner 执行一些条码扫描,在扫描块中,最终以如下代码结束扫描:
self.searchController?.decodeBarcode(code) // triggers ajax request, gets cancelled
delay (0.2)
self?.performSegueWithIdentifier("unwindFromBarcodeScanner", sender: self)
self?.scanner?.stopScanning()
这种 delay() 技术是从 this SO answer 中获得的一个想法,我们在展开时尝试停止扫描时遇到了一些其他问题,因此我们实施了该技术。
所以在遇到这个 ajax 取消问题后,我们尝试将 ajax 调用下移到 delay
代码块中,现在我们不再面临它被取消的问题。它现在看起来像这样并且工作正常:
delay (0.2)
self?.performSegueWithIdentifier("unwindFromBarcodeScanner", sender: self)
self?.scanner?.stopScanning()
self?.searchController?.decodeBarcode(code) // triggers ajax request, works fine
【讨论】:
以上是关于iOS 9 WKWebView 产生“加载资源失败:已取消”,而 iOS 8 没有的主要内容,如果未能解决你的问题,请参考以下文章
WKWebView runJavaScriptAlertPanelWithMessage 从 iOS 9.3 崩溃
在 iOS 9 中遇到 WKWebview 和 UIWebView 问题
为啥我在 iOS 9 上的 WKWebView 中的音频流无法播放?
当 navigationController 弹出时,iOS WKWebView 在 ios 8 和 ios 9 上崩溃