ios - 是什么导致模拟器上 ios 8.1 和 ios 10.2 之间的后台 URLSession 出现奇怪的差异?

标签 ios iphone swift ios-simulator ios10

我在调试我的应用程序时遇到了奇怪的行为。

我有一个带有后台配置的直接 URLSession:

        let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: (prefix + postfix))
        let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)

        progressView.setProgress(0.0, animated: false)

        var request = URLRequest(url: dlUrl )
        request.httpMethod = "GET"
        request.cachePolicy = NSMutableURLRequest.CachePolicy.reloadIgnoringCacheData

        let task = backgroundSession.downloadTask(with: request)

        task.resume()

我的测试如下:

  1. 开始在应用程序中下载。
  2. 将应用置于后台。
  3. 后台下载完成时发出通知。
  4. 点击通知后应用程序将进入前台

当我在 ios 10.2 下使用模拟器尝试此操作时,应用程序会在第 2 步后暂停下载,并且下载不会完成 - 没有显示更多错误消息或警告。当我将应用程序置于前台时,下载将继续并完成。

但是当我在模拟器和 ios 8.1 上尝试相同的操作时,一切都按预期工作。

现在是最好的部分:

在 iOS 10.2 的设备上一切都按预期工作,所以现在的问题是为什么不在模拟器上呢?这可能是由于模拟器中应用了一些资源限制吗?

最佳答案

听起来您发现了 10.2 模拟器的错误。这并不奇怪。该模拟器实际上是在 OS X 框架之上编写的,并使用粘合代码使其表现得像 iOS。

我发现问题似乎出现在模拟器与 OSX 或 iOS 设备上的自定义硬件交互的部分。

文件系统存在各种不一致,并且不完全支持 GPS 和加速度计等功能。

模拟器无法正确处理后台 NSURLSession 并不奇怪。管理从应用程序外部下载的文件并在完成后重新启动应用程序需要与低级别任务调度进行交互。

我建议向 Apple 提交雷达错误。

关于ios - 是什么导致模拟器上 ios 8.1 和 ios 10.2 之间的后台 URLSession 出现奇怪的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41591553/

相关文章:

ios - 如何动态下载字体并将其安装到 iOS 应用程序

iphone - 在现有项目中实现 CoreData (XCode 4.2)

swift - 异步返回NSData类型

ios - 检查 UserDefaults 的值并创建一个 IF 语句

ios - 远程配置 A/B 测试不会在测试设备上触发(或 100% 匹配)

iphone - 不工作时计数器

iphone - 获取 GDataFeedPhotoAlbum 返回错误的对象类型

ios - 使用复选框制作自定义 TableviewCell

ios - 自定义键盘显示在 iOS 11 中的错误位置

ios - SwiftUI 无法在 iOS 13 版本中使用 navigationBarTitle 修饰符(已弃用),但可以在 iOS 14 中使用