Как отобразить прогресс загрузки с FileProviderExtension на iOS

У меня есть приложение, которое реализует все навороты FileProviderExtension. Теперь возникает вопрос, что требуется для отображения прогресса загрузки / выгрузки в приложении "Файлы"?

Есть один ранее заданный вопрос с довольно расплывчатым ответом, который не дал никаких результатов.

Это грубый код startProvidingItem(at url: URL ...) функция:

let downloadDelegate = DownloadDelegate(completionHandler, targetLocation: url, fileManager: fileManager)
let session = URLSession(configuration: URLSessionConfiguration.default, delegate: downloadDelegate, delegateQueue: nil)
let downloadTask = session.downloadTask(with: sftpURL)

NSFileProviderManager.default.register(downloadTask, forItemWithIdentifier: id) { error in
    if let error = error {
         print("Error registering progress task \(error)")
    } else {
         print("Registered progress task")
         downloadTask.resume()
    }
}

Где DownloadDelegate вызывает completionHandler либо с ошибкой, либо nil на успех. Это все работает, но, хотя downloadTask было зарегистрировано с FileProviderManager прогресс не отображается.

Начинается показ неопределенного счетчика и Waiting to Download под файлом. Задача загрузки определенно отправляет события прогресса (подтверждается urlSession(..., totalBytesWritten: ...) метод в DownloadDelegate) но FileProvider, похоже, игнорирует их.


TL; DR: Что требуется для того, чтобы процесс загрузки работал в FileExtension?

1 ответ

Решение

Я реализовал, и он работает нормально. (См. https://forums.developer.apple.com/thread/91280)

  • URLSession должен использовать конфигурацию.background.
  • Конфигурация должна иметь действительный sharedContainerIdentifier.
  • Контейнерное приложение вашего расширения должно иметь доступ к общему контейнеру.

  • Расширение должно сообщать правильный размер файла через свойство documentSize.

Другие вопросы по тегам