我正在制作一款针对iOS 8.0的应用,需要下载高达250Mb的文件。我有一个版本的下载代码大致使用Alamofire
,但我最近用纯NSURLSession
实现替换了它。这个新的实现在模拟器和运行iOS 9.2(13C75)的iPhone 5S上按预期工作。无论我是通过XCode
和物理连接安装,还是通过TestFlight
安装,它都能在我的手机上运行。我已删除该应用,重新启动手机,然后重新安装,它始终正确完成下载。我的一位同事提取了代码,并能够从XCode
成功模拟它。
但是,我的所有合作者都无法下载。设备。他们正在通过TestFlight
安装应用,并设置为内部测试人员。一位合作者还拥有运行iOS 9.2(13C75)的iPhone 5S。基于Alamofire
的实现在通过TestFlight
部署到这些相同设备时按预期工作,而其他代码很少发生变化。
我添加了一些远程日志记录,我可以看到在发生故障的设备上,下载被正确触发,我创建的下载任务都有taskIdentifier
我可以记录。但是,不会调用NSURLSessionDelegate
或NSURLSessionDownloadDelegate
方法。
您对故障排除有什么建议?
这可能与TestFlight
问题有关吗?我目前的下一步是尝试替代TestFlight
。最终,如果可能,我希望能够通过TestFlight
部署测试版。
我在Swift 2.1.1
使用XCode 7.2 (7C68)
。
答案 0 :(得分:1)
问题原来是我将NSURLSessionConfiguration
discretionary
property设置为true。文档陈述了以下对我来说听起来不错的内容:
传输大量数据时,建议您设置 该属性的值为true。
但我没有理解其他文本的后果:
例如,系统可能会延迟传输大文件,直到设备插入并通过Wi-Fi连接到网络。
通过XCode
进行安装的原因可能是手机正在充电,因为当我开始下载或刚收费时,手机已连接到我的电脑。
我最初怀疑这个问题来自TestFlight
或关于手机状态的问题。使用Sentry进行远程日志记录(我已经将其用于后端)非常有助于深入了解我的协作者运行应用时的不同之处。我最终添加了所有NSURLSessionDownloadDelegate
方法的实现,以记录调用哪些方法。这让我看到didReceiveChallenge
是被调用的唯一委托方法,然后我花了一些时间来认为它可能是一个与auth相关的问题并在该一般区域进行故障排除。
最后,我开始注意到我自己的安装有时会失败并且一个协作者成功下载了。这让我开始考虑可能阻止下载的手机状态。我回到了NSURLSession
配置,当我读到discretionary
属性时。
回想起来,仔细检查配置是一个很好的步骤。另一件好事就是记录已创建的下载任务的state
property。