为什么在针对模拟器时框架包路径解析为 DerivedData 构建目录?
Why does framework bundle path resolve to DerivedData build directory when targeting Simulator?
差异
Xcode 工作区子项目产品(Cocoa Touch Framework)在 运行 时间使用框架实现的 Bundle(for:)
本地检索。
当 运行 在设备上时,返回的路径正确指向应用程序主包容器中的框架位置(Frameworks 文件夹,嵌入的位置):
/var/containers/Bundle/Application/[UUID]/App.app/Frameworks/Subproject.framework
但是如果为 Simulator 构建相同的应用程序,则框架包路径解析为构建目录:
/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)))
Simulator 上的 Bundle(for: type(of: self))
调用将生成 DerivedData
路径并且初始化程序将失败,因为它 requires 路径是 "Main Bundle"[ 的子路径=21=]
从 Xcode 启动时,Xcode 将 DYLD_FRAMEWORK_PATH 和 DYLD_LIBRARY_PATH 设置为构建产品路径,以便在针对它们执行测试时将链接解析为您构建的框架.
这种情况在 Xcode 中已经存在了很长时间。如果你 "finger launch" 从 SpringBoard 获取它,你应该得到你正在寻找的行为。
差异
Xcode 工作区子项目产品(Cocoa Touch Framework)在 运行 时间使用框架实现的 Bundle(for:)
本地检索。
当 运行 在设备上时,返回的路径正确指向应用程序主包容器中的框架位置(Frameworks 文件夹,嵌入的位置):
/var/containers/Bundle/Application/[UUID]/App.app/Frameworks/Subproject.framework
但是如果为 Simulator 构建相同的应用程序,则框架包路径解析为构建目录:
/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)))
Simulator 上的 Bundle(for: type(of: self))
调用将生成 DerivedData
路径并且初始化程序将失败,因为它 requires 路径是 "Main Bundle"[ 的子路径=21=]
从 Xcode 启动时,Xcode 将 DYLD_FRAMEWORK_PATH 和 DYLD_LIBRARY_PATH 设置为构建产品路径,以便在针对它们执行测试时将链接解析为您构建的框架.
这种情况在 Xcode 中已经存在了很长时间。如果你 "finger launch" 从 SpringBoard 获取它,你应该得到你正在寻找的行为。