按需资源上是否允许归档文件?

时间:2019-11-05 06:35:16

标签: ios swift

我们的应用程序中有.zip文件,标记为按需资源。下载该文件后,我们在NSBundleResourceRequest完成处理程序中获得了成功,但是找不到下载文件(.zip)的路径。它适用于png和jpg文件,但不适用于.zip文件。此外,.zip文件下载在我们的测试设备上也可以正常工作,仅在App Reviewer设备上失败。

iOS中.zip的任何替代方法都可以在ODR上使用吗?

1 个答案:

答案 0 :(得分:0)

您在conditionalyBeginAccessingResources之前使用beginAccessingResources方法吗?

资源:

从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时使用捆绑软件。

GL