- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们遇到间歇性(有时发生在某些设备上)崩溃,我们很难确定,并且无法按需重现。这与 Swift 3 和 WKWebView 组件有关,特别是在尝试通过 switch 语句获取错误代码时其回调协议(protocol)崩溃。见下文:
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
if let err = error as? URLError {
switch(err.code) { // Exception occurs on this line
case .cancelled:
Hint(hide: true)
case .cannotFindHost:
Hint(hide: false, hint:.CannotFindHost)
case .notConnectedToInternet:
Hint(hide: false, hint: .NoInternet)
case .resourceUnavailable:
Hint(hide: false)
case .timedOut:
Hint(hide: false)
default:
Hint(hide: false)
print("error code: " + String(describing: err.code) + " does not fall under known failures")
}
}
}
func Hint(hide: Bool, hint:SomeCustomEnum = SomeCustomEnum.Default) {
//Dosomething with ui to let user know something bad happened
}
错误堆栈表明:
0 _BridgedStoredNSError.code.getter
1 _BridgedStoredNSError.code.getter
2 专门的 WebKitController.webView(WKWebView, didFailProvisionalNavigation : WKNavigation!, withError : Error) -> ()
3 @obj WebKitController.webView(WKWebView, didFailProvisionalNavigation : WKNavigation!, withError : 错误) -> ()
...
查看代码似乎应该没有问题,因为在调用 switch 语句时变量 err 应该被成功地选择性地解包为有效的 URLError 对象。应该保证此时的 switch 语句在 err.code 中有一个值,因为 .code 对于 URLError 不是可选的。
迄今为止,尝试人为造成可能解释问题的错误并没有提供太多见解。 IE。如果我在没有代码属性的情况下创建自己的自定义错误,然后尝试将其转换为 URLError,它会优雅地脱离可选分配。
我们感谢您提供任何帮助或建议以解决甚至进一步解决问题,同时将继续尝试在一致的基础上进行重现。
最佳答案
在查看 Swift Bug ( https://bugs.swift.org) 提交站点时,我能够找到问题的描述,即。错误转换为 URLError 会导致属性 .code 丢失:
https://bugs.swift.org/browse/SR-3879?jql=text%20~%20%22URLError%22
这有一个指向以下引用的链接,这似乎是解决方案(仍在处理中)
https://bugs.swift.org/browse/SR-3881
实际上 URLError 缺少两个 .code 定义:
NSURLErrorAppTransportSecurityRequiresSecureConnectionNSURLErrorDataLengthExceedsMaximum
因此,如果您在引用 URLError 的 .code 属性时遇到崩溃,您可以通过转换为 NSError 并检查 NSError .code 属性来检查它。
我们正在通过临时解决方法缓解它,直到错误得到解决(下面仅解决 NSURLErrorAppTransportSecurityRequiresSecureConnection (int -1022) 类型的故障):
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
let nserr = error as NSError
if nserr.code == -1022 {
Hint(hide: false, hint: .NSURLErrorAppTransportSecurityRequiresSecureConnection)
} else if let err = error as? URLError {
switch(err.code) { // Exception no longer occurs
case .cancelled:
Hint(hide: true)
case .cannotFindHost:
Hint(hide: false, hint:.CannotFindHost)
case .notConnectedToInternet:
Hint(hide: false, hint: .NoInternet)
case .resourceUnavailable:
Hint(hide: false)
case .timedOut:
Hint(hide: false)
default:
Hint(hide: false)
print("error code: " + String(describing: err.code) + " does not fall under known failures")
}
}
}
func Hint(hide: Bool, hint:SomeCustomEnum = SomeCustomEnum.Default) {
//Dosomething with ui to let user know something bad happened
}
关于ios - Swift WKWebView 在 didFailProvisionalNavigation 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42168986/
我有一个本地化的应用程序。我用 WKWebView并发出一些网络请求。所有应用程序本地化都按预期工作。但是来自 webView:didFailProvisionalNavigation:withErr
我试图在 WKWebView 中加载页面组件时记录错误失败,但 didFailProvisionalNavigation不叫。 我删除了 CSS 文件从我的页面进行测试,但没有结果。 当我在谷歌浏览器
我正在尝试为我的 web View 显示错误消息,我需要知道不可用的 url,所以我实现了委托(delegate)方法: - (void)webView:(WKWebView *)webView di
我正在制作一个网络浏览器,并且像所有其他网络浏览器一样,我想通知用户网页加载失败时发生的错误。 目前,我正在 didFailProvisionalNavigation 方法中显示错误的 localiz
我们遇到间歇性(有时发生在某些设备上)崩溃,我们很难确定,并且无法按需重现。这与 Swift 3 和 WKWebView 组件有关,特别是在尝试通过 switch 语句获取错误代码时其回调协议(pro
我是一名优秀的程序员,十分优秀!