苹果的按需资源系统如何将文件下载到应用程序的主捆绑包中?

时间:2018-07-17 15:03:21

标签: ios swift bundle on-demand-resources

我目前正在尝试为AWS Cloudfront实施Apple的按需资源管理API,因为Apple的ODR某种程度上过于不可靠。

我注意到,当我使用ODR资源标签在Assets.scnassets /中标记图像时,我可以使用

访问该图像
UIImage(name: resourceName)

一旦它被 NSBundleRequest 对象下载。因为我可以将下载的资源作为UIImage访问,所以我知道该资源位于应用程序的主捆绑包中,但是我认为这是不可能的,因为捆绑包是只读的。苹果是怎么做到的?最重要的方面是能够使用这个非常简单的界面来创建UIImage。

2 个答案:

答案 0 :(得分:2)

  

我知道资源位于应用程序的主捆绑包中,但是我认为这是不可能的,因为捆绑包是只读的。苹果是怎么做到的?

这是一种幻想。 ODR文件被下载到应用程序捆绑包之外的目录中,并且像UIImage init(named:)这样的调用被欺骗以查找该目录。

答案 1 :(得分:1)

不确定技术上是如何完成的,但是我可以肯定,将ODR归因于特定的捆绑包(通常是main)是有目的的,因此您可以依靠它。

我正在使用RxOnDemandResources库从数十个标签中获取数百个MP3,并且它是按捆绑方式完成的-

Bundle
    .main
    .rx
    .demandResources(withTags: tags) // tags: Set<String>
    .subscribeOn(Scheduler.concurrentUser) // declare your scheduler first
    .observeOn(Scheduler.concurrentMain) // declare your scheduler first
    .subscribe { event in
        switch event {
        case .next(let progress):
            self.showProgress(progress: Float(progress.fractionCompleted)) // declare your handler first
        case .error(let error):
            break // handle appropriately
        case .completed:
            if let url = Bundle.main.url(forResource: file, withExtension: "") {
                os_log("url: %@", log: Log.odr, type: .info, "\(url)")
                // TODO use your resource
            }
        }
    }
    .disposed(by: self.disposeBag)

回到您的问题:是的,您可以像往常一样通过特定的捆绑包 访问ODR资源,但具有所有先决条件(检查可用性,如果需要则进行获取)-即并非总是