是什么导致模拟器上 ios 8.1 和 ios 10.2 之间背景 URLSession 的奇怪差异?

What causes strange differences with background URLSession between ios 8.1 and ios 10.2 on simulator?

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

我有一个带有后台配置的直接 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 一切都按预期工作。

现在是最精彩的部分:

在带有 ios10.2 的 设备上一切正常,所以现在的问题是为什么不在模拟器上?这可能是由于模拟器中应用了一些资源限制吗?

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

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

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

模拟器无法正确处理后台 NSURLSession 也就不足为奇了。管理从您的应用程序外部下载文件并在完成后重新启动您的应用程序需要与低级任务计划进行交互。

我建议向 Apple 提交 Radar 错误。