0

我已经浏览了文档和所有与 iOS 中的按需资产相关的 SO 问题,但找不到答案,因此希望您能提供帮助。我有一个能够很好地访问文件的应用程序(特别是位于名为“GameVideos”的组/文件夹中的视频 mp4 文件)。我用来执行此操作的代码是:

guard let url = Bundle.main.url(forResource: videoName, withExtension: "mp4") else {
   print("\(videoName) not found")
   return
}

let item = AVPlayerItem(url: url)
self.player1 = AVPlayer(playerItem: item)
self.videoNode1 = SKVideoNode(avPlayer: self.player1)

现在我已经切换到制作“点播”视频,我看到打印了“未找到”消息。当它没有被列为按需资源时,我不需要引用子目录 - 没有它它工作得很好(尽管我尝试添加它只是为了查看)。我也很高兴我没有拼错文件名,因为它也很好用。

创建 On Demand 资源时 - 我已使用标签进行设置并使用以下代码调用资源(此代码位于 GameViewController.swift 和“viewDidLoad”覆盖内 - 我正在构建一个 SpriteKit 游戏所以只有一个视图控制器 - 所有其他逻辑都在 SKScenes 中处理。):

let tags = NSSet(array: [
            "OD2",
            "OD3",
            "OD4",
            "OD5",
            "OD6",
            "OD7",
            "OD8",
        ])

  let resourceRequest = NSBundleResourceRequest(tags: tags as! Set<String>)

  resourceRequest.conditionallyBeginAccessingResources(completionHandler: {(resourcesAvailable: Bool) in
            if !resourcesAvailable  { // if resources not available - start download
                resourceRequest.beginAccessingResources(completionHandler: {(err: Error?) in
                    if let error = err {
                        print("Error getting On Demand Resources: \(error)")
                    }
                })
            }
        })

这段代码似乎可以工作,我可以在 Xcode 的磁盘监视器中看到 On Demand 包正在成功下载。

我尝试过的其他事情:我已经仔细检查了视频的目标成员资格,并且分配正确。
我尝试使用列出的文件夹的子目录调用 Bundle.Main.url(这也不起作用)我尝试重命名文件夹目录(因为它的名称中有空格)我尝试清理多次建造

以上都没有奏效......我做错了什么?任何猜测或指示将不胜感激。

4

1 回答 1

0

因此,经过大量试验和错误之后——我将变量“resourceRequest”放在全局范围内并且它可以工作——XCode 磁盘上的消息从“已下载”变为“正在使用”。正如您在我的代码中看到的,我之前在 GameViewController 中定义了“resourceRequest”。我原以为这适用于 SpriteKit 游戏,因为 GameViewController 加载然后它控制所有场景(所以我不认为它超出了范围)。比我更聪明的人会希望能说出为什么会这样 - 但暂时 - 我很高兴我可以继续前进并启动我的应用程序(Apple 关于这些东西的文档很糟糕)

于 2020-06-03T07:37:11.203 回答