WKWebView在没有互联网访问时不会完成/超时

WKWebView does not finish/timeout when there is no internet access

本文关键字:超时 互联网 访问 WKWebView      更新时间:2023-09-26

我通过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的脚本标记,然后使用Apple的网络链接调节器将您的互联网连接限制为"100%丢失"。

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

尝试:

WKNavigationDelegate

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error

您可以检查错误,通常您会遇到错误.code -1009:

检查此列表:错误代码

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

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

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