差异
Xcode 工作区子项目产品(Cocoa Touch Framework)在运行时使用框架实现的本地Bundle(for:)
进行检索。
在设备上运行时,返回的路径正确指向应用程序主捆绑包容器(嵌入它的框架文件夹)中的框架位置:
/var/containers/Bundle/Application/[UUID]/App.app/Frameworks/Subproject.framework
但是,如果为模拟器构建了相同的应用程序,则框架包路径将解析为 Build 目录:
/Users/username/Library/Developer/Xcode/DerivedData/App-gudzsitepqiiqaemjvwsloxbjobv/Build/Products/Debug-iphonesimulator/Subproject.framework
而Bundle.main.resourcePath
被正确解析为构建应用程序的模拟器容器。
问题
错误的路径(DerivedData
路径)在运行时无法访问,因为它不是应用程序捆绑包的子目录。这使得在使用模拟器时无法在运行时动态确定初始值设定项所需的文件名GKScene
。
上下文
以下方便的初始值设定项:
public extension GKScene {
convenience init?(fileNamed filename: String, in bundle: Bundle) {
guard
let main = Bundle.main.resourcePath,
let full = bundle.url(forResource: filename, withExtension: "sks")?.path
else {
return nil
}
let relative = full.replacingOccurrences(of: "(main)/", with: "")
self.init(fileNamed: relative)
}
}
这样称呼:
GKScene(fileNamed: "GameScene", in: Bundle(for: type(of: self)))
模拟器上的Bundle(for: type(of: self))
调用将生成DerivedData
-path,并且初始值设定项将失败,因为它要求路径是"主捆绑包"的子路径
从 Xcode 启动时,Xcode 会设置构建产品路径DYLD_FRAMEWORK_PATH和DYLD_LIBRARY_PATH,以便在对构建的框架执行测试时将链接解析为构建的框架。
在 Xcode 中已经有很长一段时间了。 如果你从SpringBoard"手指启动"它,你应该得到你正在寻找的行为。