当设备被锁定并出现错误时,URLSessionConfiguration后台下载任务失败 - 与后台传输服务失去连接

问题描述 投票:1回答:1

我得到了一个

错误域= NSURLErrorDomain代码= -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属性

任务<>。<48>完成错误 - 代码:-999

任务<>。<48>加载失败并显示错误错误域= 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个回答
0
投票

Alamofire目前与背景会话并不真正兼容,原因是由于无法坚持并重新连接其封闭API,以及当invalidateAndCancel() URLSession时它是deinit。我们建议您直接使用URLSession进行后台会话,或者将前台会话与后台任务API一起使用。


0
投票

正确检查iOS文档,alamoSessionManager.request将无法在后台运行,只有alamoSessionManager.downloadalamoSessionManager.upload才有效。

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

© www.soinside.com 2019 - 2024. All rights reserved.