2015-12-31 19 views
1

我正在构建一个针对iOS 8.0的应用程序,需要下载高达250Mb的文件。我有一个使用Alamofire的下载代码版本,但我最近用一个纯粹的NSURLSession实现取而代之。这个新的实现在模拟器和运行iOS 9.2(13C75)的iPhone 5S上按预期工作。无论我是通过XCode和物理连接还是通过TestFlight安装,它都可以在我的手机上运行。我删除了应用程序,重新启动了手机,然后重新安装,并始终正确完成下载。我的一位同事拉出了代码,并能够成功地从XCode模拟它。在TestFlight中未调用的NSURLSessionDelegate方法安装

但是,所有协作者设备上的下载都会失败。他们通过TestFlight安装应用程序,并设置为内部测试人员。一位合作者也有一台运行iOS 9.2(13C75)的iPhone 5S。基于Alamofire的实现在通过TestFlight部署到那些相同的设备并且很少其他代码已经改变时按预期工作。

我已经添加了一些远程日志记录,我可以看到,在失败的设备上,下载被正确触发,并且我创建的每个下载任务都有我可以登录的taskIdentifier。但是,调用方法都不是NSURLSessionDelegateNSURLSessionDownloadDelegate

您有什么建议可以排除故障?

这可能与TestFlight问题有关吗?我目前的下一步是尝试替代TestFlight。最终,如果可能的话,我希望能够通过TestFlight部署beta。我在XCode 7.2 (7C68)中使用Swift 2.1.1

+0

“NSURLSessionDelegate或NSURLSessionDownloadDelegate中没有一个”是否添加了委托,如果是,是否正确保留? – Vig

+0

它被添加并且这些方法在模拟器和我自己的物理设备上被调用。我认为我不需要做任何特别的事情来确保在Swift中的保留,但请让我知道,如果有什么我应该确保为此做! –

+1

你是对的我忘了它在模拟器和设备上运行的事实。也没有意识到它的迅速....无论如何,我能想到的是检查AppTransportSecurity,但如果它在模拟器上工作,那么我认为问题在其他地方 – Vig

回答

0

问题原来是因为我已将NSURLSessionConfigurationdiscretionary property设置为true。该文档声明以下对我来说很好:

当传输大量数据时,建议您将此属性的 值设置为true。

但我没有意识到这些文本的其余部分的后果:

例如,系统可能会延迟,直到该设备已插上电源并连接到通过的Wi-网络传输大文件网络连接。

安装通过XCode工作的原因可能是手机要么因为连接到我的电脑,而是刚开始下载或刚刚充电时被收费。

我最初怀疑问题来自TestFlight或有关手机状态。使用Sentry(我已经用于后端)进行远程日志记录对于了解我的协作者运行应用程序时的不同之处非常有帮助。我最终在实现中添加了所有的NSURLSessionDownloadDelegate方法来记录哪些方法被调用。这导致我看到didReceiveChallenge是唯一被调用的委托方法,然后我花了一些时间认为它可能是一个认证相关的问题并在该常规区​​域进行故障排除。

最后,我开始注意到,我自己的安装有时会失败,并且一位合作者成功下载。这让我开始考虑可能会阻止下载的手机状态。我回到了NSURLSession的配置,当时我读到了discretionary的属性。

回想起来,仔细检查配置是早些时候做的很好的一步。另一件好事就是记录已创建的下载任务的state property

相关问题