为什么在针对模拟器时框架包路径解析为 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 获取它,你应该得到你正在寻找的行为。