没有互联网访问时,WKWebView无法完成/超时

dep*_*ner 17 javascript timeout ios wkwebview

我正在通过WkWebView导航到的本地HTML页面上有一个远程Javscript资产标签,它永远不会完成下载(在iOS设备未连接到互联网或设备的互联网速度太慢的情况下).

不幸的是,WKWebView永远不会中止尝试下载这个资产,也不会转移到我的WKNavigationDelegate(即既-webView:didFailNavigation:withError:不会也不会-webView:didFinishNavigation: neither被调用),因此用户会遇到一个空白的HTML页面,该页面永远无法完全解析并且永远不会出错.

值得庆幸的是,在某些情况下,我通过Safari远程iOS Javascript调试器进行了调试,我注意到我们将错误Failed to load resource: The Internet connection appears to be offline记录到控制台,但在其他情况下(如飞机模式中的某些设备),WKWebView似乎永远不会因此错误或放弃,所以没有WKNavigationDelegate回调被解雇.

您可以通过将iOS 8.2模拟器与任何WKWebView iOS应用程序一起使用来重现此场景,导航到任何本地提供的HTML文件,然后使用任何远程URL添加脚本标记,然后使用任何远程URL将您的Internet连接限制为"100%丢失" Apple的网络链接调节器.

什么是强制WkWebView通过错误或成功回调到其WKNavigationDelegate超时/返回的最佳方法?

Gab*_*ana 21

尝试:

WKNavigationDelegate

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
Run Code Online (Sandbox Code Playgroud)

你可以检查错误,通常你会有一个error.code -1009:

检查此列表:错误代码

  • -1这种方法很长时间不会被调用,因此不是答案.我看过`-webView :: didFinishNavigation:`之前已经看了一分钟.真正的OP问题在最后一段. (9认同)
  • 如果没有网络连接,这会立即返回错误 (2认同)
  • 在 Swift 3 中,现在是 `func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {` 并且 Error 没有成员 `.code`。 (2认同)
  • 我将iPhone置于飞行模式并进行了测试,但是didFailProvisionalNavigation不会被调用。 (2认同)

Ste*_*ntz -1

我认为您必须在 HTML 页面中执行此操作。您可以在其中包含一个小的 JavaScript,它运行计时器并检查您的远程脚本是否已加载。

如果尚未加载,则 JavaScript 可以直接在页面中显示错误或通过脚本消息处理程序通知您的应用程序。

(我不认为 HTML 有一个页面可以用来查找内容加载错误的 API。在验证外部脚本是否已加载上有一些关于此的提示)