【问题标题】:How to display download progress with FileProviderExtension on iOS如何在 iOS 上使用 FileProviderExtension 显示下载进度
【发布时间】:2019-02-07 19:44:07
【问题描述】:

我有一个应用程序,它实现了 FileProviderExtension 的所有花里胡哨。现在问题来了,在“文件”应用中显示下载/上传进度需要什么?

有一个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 中使下载进度正常工作需要什么?

【问题讨论】:

  • 您设法解决了这个问题吗?我也有。我尝试了建议的答案,但它根本没有帮助。在下载实际完成之前,我仍然看到“等待下载”。
  • IIRC 接受的答案在使用常规 URLSession 时确实有效。它并没有最终适用于我的用例,因为我无法在我的自定义 URLSession 上使用 .background (正在使用自定义协议定义或 smth)。一定要设置documentSize属性,否则无法计算进度。
  • 感谢您的快速响应,不幸的是它没有工作。我尝试使用 URLSession.shared 并尝试使用默认配置的新会话对象。奇怪的是,使用后台配置我可以从预览页面看到进度,但不能在列表视图中看到。一个多星期以来,我一直在努力解决这个问题!
  • 您能澄清一下“预览页面”的含义吗?下载文件的文件应用程序预览?后台下载的问题是它们在您的应用程序沙箱之外执行(因此需要共享容器标识符)。你指的是什么列表视图?
  • 最简单的方法是显示它:cti.ctera.com/invitations?share=dd8e8d1bc3331646c17b,链接到显示问题的视频

标签: ios ios-app-extension fileprovider-extension


【解决方案1】:

我已经实施并且工作正常。 (见https://forums.developer.apple.com/thread/91280#292614

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

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

【讨论】:

  • 您实际上是对的 - 原来我的问题与不使用 HTTP/HTTPS 的下载有关,因此后台会话立即终止(在文档中的某处它指出后台下载仅限于这两种协议)。
  • 您认为什么是“有效的 sharedContainerIdentifier”?我也面临同样的问题
  • 它指的是 URLSessionConfiguration 的 .sharedContainerIdentifier,它决定了文件被下载/存储到的 sharedContainer。 Apple Doc 您必须将其设置为您在 Apps plist 文件中指定的有效容器。 Some more docs on that here,下载会话的行为基本上很像应用程序扩展!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多