按需资源是不是允许存档文件?

Posted

技术标签:

【中文标题】按需资源是不是允许存档文件?【英文标题】:Is archive files allowed on On-Demand Resource?按需资源是否允许存档文件? 【发布时间】:2019-11-05 06:35:16 【问题描述】:

我们在应用中有 .zip 文件,标记为按需资源。在下载它时,我们在 NSBundleResourceRequest 完成处理程序中获得成功,但无法找到下载文件(.zip)的路径。它适用于 png 和 jpg 文件,但适用于 .zip 文件。此外,.zip 文件下载在我们的测试设备上运行良好,仅在 App Reviewer 设备上失败。

ios 中 .zip 的任何替代方案都适用于 ODR 吗?

【问题讨论】:

您以哪种方式下载 .zip 文件?你能分享一下代码的平静吗? 使用 NSBundleResourceRequest 的 beginAccessingResources api,我们正在下载资源包。一旦下载成功完成,我们将通过 NSBundle 的 url(forResource: tag, withExtension: ext) api 查找下载的文件。 【参考方案1】:

你是在beginAccessingResources之前使用conditionalyBeginAccessingResources方法吗?

资源:

查看来自 Ray 的漂亮 ODR ios tutorial 和来自 Vandad 的 this book(它包含一个用于获取适当 ODR 的部分)。

来自 Ray 的教程:

class ODRManager 

  // MARK: - Properties
  static let shared = ODRManager()
  var currentRequest: NSBundleResourceRequest?

  // MARK: - Methods
  func requestFileWith(tag: String,
                        onSuccess: @escaping () -> Void,
                        onFailure: @escaping (NSError) -> Void) 

    currentRequest = NSBundleResourceRequest(tags: [tag])

    guard let request = currentRequest else  return 

    request.endAccessingResources()

    request.loadingPriority =
    NSBundleResourceRequestLoadingPriorityUrgent

    request.beginAccessingResources  (error: Error?) in
      if let error = error 
        onFailure(error as NSError)
        return
      

      onSuccess()
    
  

正在使用:
  ODRManager.shared.requestFileWith(tag: "<#Your tag#>", onSuccess: 
    // load it through Bundle
  , onFailure:  (error) in
    let controller = UIAlertController(title: "Error", message: "There was a problem.", preferredStyle: .alert)

    switch error.code 
    case NSBundleOnDemandResourceOutOfSpaceError:
      controller.message = "You don't have enough space available to download this resource."
    case NSBundleOnDemandResourceExceededMaximumSizeError:
      controller.message = "The bundle resource was too big."
    case NSBundleOnDemandResourceInvalidTagError:
      controller.message = "The requested tag does not exist."
    default:
      controller.message = error.description
    

    controller.addAction(UIAlertAction(title: "Dismiss", style: .default, handler: nil))
    guard let rootViewController = self.view?.window?.rootViewController else  return 

    rootViewController.present(controller, animated: true)
  )

从书中:

let tag = "<#tagString#>"
var currentResourcePack: NSBundleResourceRequest? = NSBundleResourceRequest(tags: [tag])
guard let req = currentResourcePack else  return 

req.conditionallyBeginAccessingResources  available in
  if available 
    self.displayImagesForResourceTag(tag)
   else 
    // this usualy means that the resources are not downloaded so you need to download them first
    req.beginAccessingResources  error in
      guard error == nil else 
        <#/* TODO: you can handle the error here*/#>
        return
      
      self.displayImagesForResourceTag(tag) 
    
  


func displayImagesForResourceTag(_ tag: String) 
  OperationQueue.main.addOperation 
    for n in 0..<self.imageViews.count 
      self.imageViews[n].image = UIImage(named: tag + "-\(n+1)")
    
  

那么,也许你可以在那里挖掘出 zip 的来源?

另一种方式

另一种解决方案是下载 zip,解压缩并使用 FileManager 开始使用解压沙箱目标文件夹中的资源,并且仅在没有或无法下载 ODR 时使用 Bundle。

GL

【讨论】:

我们已经实现了与上面相同的实现,一旦下载完成,我们将在 Documents 文件夹中提取 zip 文件。这可在所有设备上无缝运行,但不适用于审阅者设备。 @Nikola 添加代码获取下载进度百分比

以上是关于按需资源是不是允许存档文件?的主要内容,如果未能解决你的问题,请参考以下文章

按需资源 (ODR) 已完成/下载标签的总文件大小

如何在 Windows 资源管理器中刷新文件的缩略图?

hadoop之 HDFS-Hadoop存档

如何检查该文件是不是存在于 zip 存档中?

为啥生化危机5存档文件存在,游戏提示未找到

7日杀在哪里复制一个存档