我认为您缺少正确的方法。
您不需要将低级网络错误本地化为:
- 通常对最终用户无用
- 便于开发,而不是显示(您最终可以记录它们..)
- 当您获得代码时,将其更改为可读的通用消息,然后对其进行本地化。
对于第三点:
final private func downloadMyData(){
guard let myURL = URL(string: "__https://ingconti.com/wrongurl") else{
return
}
let session = URLSession.shared
let task = session.dataTask(with: myURL) { (data: Data?, response: URLResponse?, error: Error?) in
// session cannot be created...
if let error = error {
self.manageLowLevel(error: error)
return
}
var statusCode: Int = 0
if let httpResponse : HTTPURLResponse = response as? HTTPURLResponse{
statusCode = httpResponse.statusCode
}
if 200 ... 299 ~= statusCode {
self.parse(data: data)
}else{
self.manageHTTPError(code: statusCode, data: data)
}
}
task.resume()
}
如果你有一个大错误(例如在我的代码中我使用了错误的前缀“__https”)你会得到 _code = -1022,
你可以这样管理:
final private func manageLowLevel(error: Error){
#if DEBUG
print(error)
#endif
var msg = ""
let code = error._code
switch code {
case -1002:
msg = localized("GENERIC_NETWORK_ERR")
default:
msg = localized("GENERIC_NETWORK_ERR")
}
// display msg... (on MAIN THREAD...)
}
func localized(_ msg: String)->String{
let s = NSLocalizedString(msg, comment : "")
return s
}
您可以在哪里屏蔽最终用户的消息并使其更通用(并使用便利功能“本地化”进行本地化)
对于 HTTP 错误(例如未找到资源...即“ https://ingconti.com/wrongurl ”),您将在 http/s 中收到错误 404。
所以你可以做类似的事情:
final private func manageHTTPError(code: Int, data : Data?){ guard let data = data else{ return }
#if DEBUG
if let s = String(data: data, encoding: .utf8){
print(s)
}else{
if let s = String(data: data, encoding: .ascii){
print(s)
}
}
#endif
var msg = ""
switch code {
case 404:
msg = localized("NETWORK_CODE_404")
default:
msg = localized("GENERIC_NETWORK_ERR")
}
// display msg...
}
甚至合并在一起。
(字符串 s 在
#if DEBUG if let s = .....
将显示服务器错误,并且再次不向用户显示...)
总结一下:所以不显示低级错误,请参阅温和的消息,例如在您本地化的字符串中您可以拥有:
"GENERIC_NETWORK_ERR" = "网络错误"; “NETWORK_CODE_404”。= "网络错误(无数据)";
和西班牙语...
"GENERIC_NETWORK_ERR" = "红色错误"; ...
希望它可以提供帮助。