我们遇到了一个间歇性(在某些设备上,某些时间发生)的崩溃问题,我们很难确定问题所在,并且无法按需重现。这与Swift 3和WKWebView组件有关,具体来说,当尝试通过switch语句获取错误代码时,其回调协议会导致崩溃。请参见下面的内容:
错误堆栈信息如下:
0 _BridgedStoredNSError.code.getter 1 _BridgedStoredNSError.code.getter 2 WebKitController.webView(WKWebView, didFailProvisionalNavigation : WKNavigation!, withError : Error) -> ()
3 @obj WebKitController.webView(WKWebView, didFailProvisionalNavigation : WKNavigation!, withError : Error) -> ()
...
通过审查代码,似乎应该没有问题,因为在调用switch语句时,变量err成功地被可选解包为有效的URLError对象。此时, err.code对于URLError来说不是可选项,因此switch语句应保证有该值。
目前尝试人为制造错误并排除问题,但并没有得到很多启示。例如,如果我创建自己的自定义错误而没有code属性,然后尝试将其强制转换为URLError,它会优雅地退出可选分配。
如果您有任何帮助或建议来解决问题甚至进一步进行故障排除,我们将不胜感激,在此期间将继续尝试在一致的基础上复制。
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 : Error) -> ()
...
通过审查代码,似乎应该没有问题,因为在调用switch语句时,变量err成功地被可选解包为有效的URLError对象。此时, err.code对于URLError来说不是可选项,因此switch语句应保证有该值。
目前尝试人为制造错误并排除问题,但并没有得到很多启示。例如,如果我创建自己的自定义错误而没有code属性,然后尝试将其强制转换为URLError,它会优雅地退出可选分配。
如果您有任何帮助或建议来解决问题甚至进一步进行故障排除,我们将不胜感激,在此期间将继续尝试在一致的基础上复制。