定位模拟器时,为什么框架捆绑包路径解析为DerivedData构建目录?

时间:2019-06-14 00:49:56

标签: ios swift ios-simulator

差异

使用框架实现本地的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路径是“主捆绑包”的子路径

1 个答案:

答案 0 :(得分:1)

从Xcode启动时,Xcode将DYLD_FRAMEWORK_PATH和DYLD_LIBRARY_PATH设置为构建产品路径,以便在对构建的框架执行测试时将链接解析为构建的框架。

在Xcode中已经有相当长的一段时间了。如果您从SpringBoard中“手指启动”它,那么您应该会得到想要的行为。