iOS 13 фоновая проблема загрузки - PullRequest
3 голосов
/ 27 января 2020

У меня есть функция синхронизации, когда в фоновом режиме происходит серия загрузок.

Для этого я создаю экземпляр 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 ожидает каких-либо изменений в этой реализации, например, от c до iOS 13?

Редактировать:

Я уже добавил handleEventsForBackgroundURLSession перезвонить. Обнаружено, что соответствующие журналы не распечатываются, а размер приложения не увеличивается в настройках iOS 13. Итак, похоже, что загрузка не продолжается в фоновом режиме и это не связано с тем, что обратные вызовы, связанные с загрузкой, не запускаются.

1 Ответ

2 голосов
/ 27 января 2020

Я полагаю, что если вы запустите приложение на переднем плане, то все будет работать, как и ожидалось, однако, как только приложение переведено в фоновый режим, обратного вызова больше не будет получено

BackgroundDownloader работает только тогда, когда приложение находится в на переднем плане, но есть определенная поддержка c, когда приложение переходит в приостановленное / фоновое состояние.

Когда приложение находится в состоянии приостановки / завершения и загрузка завершена, iOS разбудит приложение (в фоновом режиме) путем вызова:

class AppDelegate: UIResponder, UIApplicationDelegate { 

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

Изменение поведения между ios12 и ios13, вероятно, не связано с некоторыми изменениями API, а только с более агрессивной политикой энергосбережения для приложения, когда они не находятся на переднем плане

Изменение идентификатора фоновой конфигурации URLSession. Присвоение isDiscretionary значения false, чтобы избежать планирования ОС передачи фоновых запросов из-за заряда батареи или производительности. Наиболее важный из них должен иметь значение UseExtendedBackgroundIdleMode как true. Это самая лучшая линия, позволяющая открывать сокеты TCP даже тогда, когда приложение заблокировано или приостановлено.

...