NSURLSession错误处理

问题描述 投票:6回答:4

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

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

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

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

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

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

ios objective-c swift afnetworking
4个回答
21
投票

看看由此产生的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),如果你探索那些,你实际上会看到与这些常量相关的数值。


2
投票

斯威夫特4

if let error = error as NSError?, error.domain == NSURLErrorDomain && error.code == NSURLErrorNotConnectedToInternet {
      //not connected
}

0
投票
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


-1
投票

你的意思是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。希望它会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.