什么情况下 NSURLSession 的数据返回 nil?

Posted

技术标签:

【中文标题】什么情况下 NSURLSession 的数据返回 nil?【英文标题】:Under what circumstances does NSURLSession return nil for its data? 【发布时间】:2015-10-07 18:48:23 【问题描述】:

我的崩溃报告是由于未对 dataTask 完成块中的数据执行零检查而导致的。修复错误是微不足道的,但是,在什么情况下会发生这种情况?在我所有的测试中,我总是收到一个 0 字节的 NSData,而不是零——但很明显,如果它在崩溃日志中,它就会发生。我尝试过禁用连接(通过飞行模式)、反馈无效的 HTTP 响应、超时 HTTP 响应、在连接仍在传输时最小化应用程序等等……我已经做了我能想到的一切,但永远不会让数据为零——只有 0 个字节。我没有想到什么?

NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
    // What kind of server-response/connection-scenarios would make data be nil...? (not 0 bytes)
];
[task resume];

【问题讨论】:

错误说明了什么? if( !data ) NSLog(@"%@", error); 就是这样:我试图找到产生 nil 数据的场景——所以我不知道/有 NSError。只有生产用户会遇到它,而我得到的只是一个堆栈跟踪。 (“致命异常:NSInvalidArgumentException 数据参数为零”) 你知道iOS 9's ATS disabling of HTTP in favor of HTTPS吗? iOS 版本会是一个因素吗? 这是个好主意——尤其是因为所有报告都来自 iOS9。我会把它指向一个不支持 https 的 http 服务器,看看我是否能得到一个 nil 响应!谢谢你的主意。我过会儿再来汇报。 @JoshCaswell:是的!你,先生,摇滚。这正是场景。非常感谢。如果您将此作为对此问题的答案(而不是评论),我会接受。 【参考方案1】:

在 Josh Caswell 的建议下,我想出了一个答案。

似乎只有 iOS9 NSURLSession 将为 nil;以前的版本只包含一个零字节的 NSData。当 http 请求无法升级到 https 时,我得到了一个 nil 数据响应(有关上下文,请参阅上面的 cmets),而且任何时候应用程序无法建立连接——这包括与某些运营商通话/电话,或服务差。这让我相信这不是 ATS 特定的情况,而是任何涉及数据传输层的错误似乎都会导致数据为零。

所以,简而言之,重要的是要知道,从 iOS9 开始,数据才开始为零。

【讨论】:

这对我帮助很大! “nil”响应导致我的 NSURLSession 在从睡眠模式(解锁)返回时崩溃。通过在检查“nil”并创建一个新会话后调用 return 我能够修复它 √ 干得好 是的。因此,我遇到了 iOS 8 和更少设备的问题。有趣的是,文档明确指出如果请求失败,数据将为nil

以上是关于什么情况下 NSURLSession 的数据返回 nil?的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 不返回数据

NSURLSession 啥时候运行?

从 NSURLSession completionHandler 返回数据

NSURLSession.sharedSession().dataTaskWithRequest 运行缓慢

更改现有 NSURLSession 上的 allowedCellularAccess

NSURLSession 不使用缓存的响应