NSURLSession错误处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSURLSession错误处理相关的知识,希望对你有一定的参考价值。

使用Swift和NSURLSession。当我没有互联网连接(手动关闭wifi /小区网络)时,我得到的NSError localizedDescription非常通用。它说“操作无法完成”。

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in

我正在寻找一个更具体的消息发送给用户。我启用了断点并检查了所有对象,但找不到任何好的东西。

在swift之前我使用AFNetworking和目标C:

failure:^(AFHTTPRequestOperation *operation, NSError *error) {

我在这里得到的错误消息非常具有描述性,例如“互联网连接似乎处于脱机状态”

答案

看看由此产生的code物体的domainNSError。您可以诊断为什么它没有看到那些。

例如,NSURLErrorDomain的域名​​和-1009的代码意味着您没有连接到互联网。所以在Swift 3中:

if let error = error as? NSError, error.domain == NSURLErrorDomain && error.code == NSURLErrorNotConnectedToInternet {
    print("not connected")
}

您可以在Global Variables - Foundation Constants Reference中看到这些代码的列表。只需在“NSURL Domain”下进行探索。

此外,按命令+ shift + o搜索NSURLErrorNotConnectedToInternet然后,您将被带到相关的标题(NSURLError.h)。就个人而言,我倾向于比文档更多地信任标题。如果你在使用Objective-C时进行搜索,你甚至可以看到对CFURLError代码的交叉引用(你可以命令点击或命令+ shift + o并搜索kCFURLErrorNotConnectedToInternet),如果你探索那些,你实际上会看到与这些常量相关的数值。

另一答案

斯威夫特4

if let error = error as NSError?, error.domain == NSURLErrorDomain && error.code == NSURLErrorNotConnectedToInternet {
      //not connected
}
另一答案
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
if error == nil {
   //all ok do what you want to do
} else {
   let alertController = UIAlertController(title: "Error", message: "Put your error message here", preferredStyle: .Alert)

   let cancelAction = UIAlertAction(title: "OK", style: .Cancel) { (action) in
                      }
   alertController.addAction(cancelAction)
   self.presentViewController(alertController, animated: true)
}
})

此实现向用户显示出现错误的警报。您可以根据需要处理错误(例如,通过重试请求而不会通过警报来骚扰用户)。 UIAlertController仅限ios 8。如果你想支持iOS 7显示一个UIAlertView

另一答案

你的意思是operation.responseString来自后端的特定错误响应吗?我昨天才找到它,在AFHTTPSessionManager请求的失败块中检查出来

NSError *underError = error.userInfo[@"NSUnderlyingError"];
NSData *responseData = underError.userInfo[@"com.alamofire.serialization.response.error.data"];

这是the question I asked at AFN/Github。希望它会有所帮助。

以上是关于NSURLSession错误处理的主要内容,如果未能解决你的问题,请参考以下文章

管理错误时,带有 JSON 数据参数的 NSURLSession 崩溃为零

NSURLSession 错误域 = NSPOSIXErrorDomain 代码 = 2 “没有这样的文件或目录”

NSUrlSession 代理请求失败,错误代码为 310 (kCFErrorHTTPSProxyConnectionFailure)

NSURLSession GET 请求:DidCompleteWithError - 错误为空

NSURLSession 完成处理程序非常慢

NSURLSession 断点下载