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 上崩溃

WKWebView 视口缩小以适应在 iOS 9.3 上不起作用

加载资源失败:net::ERR_INSECURE_RESPONSE socket.io