没有互联网访问时,WKWebView 未完成/超时
Posted
技术标签:
【中文标题】没有互联网访问时,WKWebView 未完成/超时【英文标题】:WKWebView does not finish/timeout when there is no internet access 【发布时间】:2015-05-12 07:49:17 【问题描述】:我通过 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 回调。
您可以通过使用带有任何 WKWebView iOS 应用程序的 iOS 8.2 模拟器自行重现此场景,导航到任何本地提供的 HTML 文件,然后添加带有任何远程 URL 的脚本标签,然后将您的 Internet 连接限制为“100%损失”使用苹果的Network Link Conditioner。
通过对其 WKNavigationDelegate 的错误或成功回调来强制 WkWebView 超时/返回的最佳方法是什么?
【问题讨论】:
【参考方案1】:试试:
WKNavigationDelegate
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
你可以检查错误,通常你会有一个error.code -1009:
查看此列表:Error Codes
【讨论】:
-1 这个方法不会被调用很长时间,因此不是答案。在调用-webView:: didFinishNavigation:
之前,我已经看了一分钟。真正的 OP 问题在最后一段。
在飞行模式下几乎立即失败;赞成。
如果没有网络连接会立即返回错误
在 Swift 3 中,现在是 func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error)
并且 Error 没有成员 .code
。
我将 iPhone 调至飞行模式并进行了测试,但不会调用 didFailProvisionalNavigation。【参考方案2】:
我认为您必须在 HTML 页面中执行此操作。您可以在其中包含一个运行计时器并检查您的远程脚本是否已加载的小型 JavaScript。
如果尚未加载,则 JavaScript 可以直接在页面中显示错误或通过脚本消息处理程序通知您的应用程序。
(我不认为 HTML 有一个 API 可以让页面用来找出内容加载错误。Verify External Script Is Loaded 上有一些提示)
【讨论】:
如何检查 Javascript 以查看远程脚本 HTML 标记是否已完成加载?远程脚本在立即调用的函数中运行所有内容,因此我无法检查是否存在全局变量。以上是关于没有互联网访问时,WKWebView 未完成/超时的主要内容,如果未能解决你的问题,请参考以下文章
使用 WKWebView 时,localStorage 未保存在 iFrame 中
WKWebView:应用程序因“NSInternalInconsistencyException”异常而崩溃,因为“未调用传递给 X 的完成处理程序”