如何在 iOS 上使用 FileProviderExtension 显示下载进度

How to display download progress with FileProviderExtension on iOS

我有一个应用程序实现了 FileProviderExtension 的所有功能。现在问题来了,在文件应用程序中显示 download/upload 进度需要什么?

有一个 previously asked question 的答案相当模糊,没有产生任何结果。

这是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。下载任务肯定会发送进度事件(用 DownloadDelegate 中的 urlSession(..., totalBytesWritten: ...) 方法确认)但 FileProvider 似乎忽略了它们。


TL;DR:在 FileExtension 中进行下载需要什么?

我已经实施并且运行良好。 (参见 https://forums.developer.apple.com/thread/91280#292614

  • URLSession 应该使用 .background 配置。
  • 配置应具有有效的 sharedContainerIdentifier。
  • 您的扩展程序的容器应用程序应有权访问共享容器。

  • 扩展程序应通过 documentSize 属性 报告正确的文件大小。