Apple 的 On Demand Resource System 如何将文件下载到 App 的 Main Bundle 中?

How Does Apple's On Demand Resource System download files to the App's Main Bundle?

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

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

访问该图像
UIImage(name: resourceName)

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

不确定它在技术上是如何完成的,但我很确定将 ODR 归因于特定的捆绑包(通常是主要的)是故意完成的,因此您可以信赖它。

我正在使用 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 资源 但有所有先决条件(检查可用性,如果需要则获取) - 即 不总是.

I know that the resource is located in the app's main bundle but I thought this was impossible because Bundles were read-only. How did apple do this?

这是幻觉。 ODR 文件被下载到应用程序包之外的目录,并且 UIImage init(named:) 之类的调用被调换以在该目录中查找。