iOS 13后台下载问题

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

我具有同步功能,在后台会进行一系列下载。

为此,我创建具有以下背景配置的URLSession实例:

let config = URLSessionConfiguration.background(withIdentifier: "BackgroundSessionDL")
config.httpMaximumConnectionsPerHost = 20

self.session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

每个下载任务(可能有几百个)添加如下:

var request = URLRequest(url: url)
request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")

let downloadTask = self.session.downloadTask(with: request)
downloadTask.resume()

此代码在iOS 12或更早版本上可以完美运行-即使已添加的任务在后台继续下载。但是,对于iOS 13,导致问题如下:

  1. 应用程序进入后台后,下载就会停止。
  2. [如果正在执行任何下载任务,并且将应用程序置于后台,即使将应用程序再次置于前台,也不会观察到与回调相关的日志。

我尝试搜索Apple引入的用于在iOS 13上进行后台任务下载的任何新类/框架,但没有找到任何相关内容。同样,在早期版本中使用的用于表示后台下载任务的类在iOS 13中仍然不被弃用,并且是在iOS 13上搜索后台下载时的唯一结果。同样,用于HTTP会话的后台配置仍然没有不推荐使用。因此,我相信当前的后台下载实现是Apple推荐的一种。(据我了解,“ BGTaskScheduler”并非用于此目的,如果有误,请纠正我。)

所以,这是由于iOS 13中新引入的错误造成的吗?还是Apple希望针对iOS 13进行此实现的任何更改?

编辑:

我已经添加了handleEventsForBackgroundURLSession回调。发现未打印相应的日志,并且在iOS 13的“设置”中应用程序的大小没有增加。因此,似乎下载未在后台继续,并且与未调用与下载相关的回调无关。

ios swift nsurlsession ios13 nsurlsessiondownloadtask
1个回答
1
投票

我想如果您在前台运行该应用程序,那么一切都会按预期进行,但是一旦将应用程序置于后台,就不会再收到回调了

BackgroundDownloader仅在应用程序处于前台状态时有效,但是在应用程序进入挂起/后台状态时有特定的支持。

[当应用处于暂停/终止状态并且下载完成时,iOS会通过调用:(在后台)将应用唤醒:

class AppDelegate: UIResponder, UIApplicationDelegate { 

    func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
        //TODO: Handle processing downloads
    }
}

ios12和ios13之间的行为更改可能与某些API更改无关,而只是在应用程序不在前台时才采用了更为激进的省电策略

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