Bundle(for:)
在运行时检索Xcode工作区子项目产品(Cocoa Touch Framework)。
在设备上运行时,返回的路径正确指向应用程序主捆绑包容器(嵌入该文件夹的Frameworks文件夹)中的框架位置:
/var/containers/Bundle/Application/[UUID]/App.app/Frameworks/Subproject.framework
但是,如果为Simulator构建了相同的应用程序,则框架束路径将解析为Build目录:
/Users/username/Library/Developer/Xcode/DerivedData/App-gudzsitepqiiqaemjvwsloxbjobv/Build/Products/Debug-iphonesimulator/Subproject.framework
将Bundle.main.resourcePath
正确解析为已构建应用程序的Simulator的容器。
错误的DerivedData
路径在运行时无法访问,因为它不是应用程序包的子目录。这使得无法确定所需的文件名GKScene
初始化程序使用Simulator在运行时动态地动态显示。
以下便捷初始化程序:
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)))
在Simulator上的Bundle(for: type(of: self))
调用将生成DerivedData
路径,并且初始化程序将失败,因为它requires路径是“主捆绑包”的子路径
答案 0 :(得分:1)
从Xcode启动时,Xcode将DYLD_FRAMEWORK_PATH和DYLD_LIBRARY_PATH设置为构建产品路径,以便在对构建的框架执行测试时将链接解析为构建的框架。
在Xcode中已经有相当长的一段时间了。如果您从SpringBoard中“手指启动”它,那么您应该会得到想要的行为。