Apple 的点播资源系统如何将文件下载到 App 的主包?

bto*_*om5 5 bundle ios swift on-demand-resources

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

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

UIImage(name: resourceName)
Run Code Online (Sandbox Code Playgroud)

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

Max*_*gin 1

不确定它在技术上是如何完成的,但我非常确定将 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)
Run Code Online (Sandbox Code Playgroud)

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