【问题标题】:URLSessionConfiguration Background download task fails when device is locked with error - Lost connection to background transfer serviceURLSessionConfiguration 设备被锁定时后台下载任务失败 - 与后台传输服务的连接丢失
【发布时间】:2019-07-25 06:52:10
【问题描述】:

我来了

Error Domain=NSURLErrorDomain Code=-997 "失去与后台传输服务的连接"

当我在启动后台下载过程后锁定屏幕时。我正在使用 Alamofire,但我认为这也会发生在常规 URLSession 上。如果我软关闭应用程序,下载将继续工作,但一旦我锁定我的设备,它就会开始抛出此错误。

以下是代码的相关部分:

private(set) lazy var alamoSessionManager: SessionManager = {
    let config = URLSessionConfiguration.background(withIdentifier: "MySession")
    config.isDiscretionary = true
    config.sessionSendsLaunchEvents = true
    config.shouldUseExtendedBackgroundIdleMode = true
    return Alamofire.SessionManager(configuration: config)
}()

let route = buildRouter()

alamoSessionManager.request(url, method: route.method, parameters: route.parameters, encoding: JSONEncoding.default, headers: route.headers)

我查看了控制台以查看是否有任何守护程序崩溃但找不到任何守护程序。锁定屏幕后我立即看到三个错误:

BKLogEvent:找不到 CombinedSequence 属性

任务 . 以错误结束 - 代码:-999

任务 . 加载失败,错误域=NSURLErrorDomain 代码=-997“与后台传输服务的连接丢失” UserInfo={NSErrorFailingURLStringKey=, NSErrorFailingURLKey=, _NSURLErrorRelatedURLSessionTaskErrorKey=, _NSURLErrorFailingURLSessionTaskErrorKey=, NSLocalizedDescription=丢失连接到后台传输服务} [-997]

error._userInfo 是这样的:

▿ Optional<AnyObject>
  ▿ some : 5 elements
    ▿ 0 : 2 elements
      - key : NSErrorFailingURLStringKey
      - value : https://www.myweb.com/api
    ▿ 1 : 2 elements
      - key : NSErrorFailingURLKey
      - value : https://www.myweb.com/api
    ▿ 2 : 2 elements
      - key : _NSURLErrorRelatedURLSessionTaskErrorKey
      ▿ value : 2 elements
        - 0 : BackgroundDataTask <C39E-2FC73>.<27>
        - 1 : LocalDataTask <C39E-2FC73>.<27>
    ▿ 3 : 2 elements
      - key : _NSURLErrorFailingURLSessionTaskErrorKey
      - value : BackgroundDataTask <C39E-2FC73>.<27>
    ▿ 4 : 2 elements
      - key : NSLocalizedDescription
      - value : Lost connection to background transfer service

【问题讨论】:

    标签: ios swift alamofire nsurlsession nsurlsessiondownloadtask


    【解决方案1】:

    Alamofire 目前与后台会话并不真正兼容,这既是因为无法持久化和重新连接其关闭 API,也因为它在 invalidateAndCancel()URLSession 时是 deinitd。我们建议您直接将URLSession 用于后台会话,或者将前台会话与后台任务 API 一起使用。

    【讨论】:

    • 它不适用于 URLSession,你会得到完全相同的错误。也许你知道真正的根本原因?
    【解决方案2】:

    正确检查 iOS 文档,alamoSessionManager.request 不会在后台工作,只有 alamoSessionManager.downloadalamoSessionManager.upload 可以工作。

    当您使用alamoSessionManager.download 时,JSON 响应将被下载并保存在一个 tmp 文件中。确保移动到永久位置并读取文件并将其转换为JSONDecoder 对象。如果您不清楚,请告诉我。

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2017-09-21
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多