Расхождение
Продукт подпроекта рабочей области Xcode (Cocoa Touch Framework) извлекается во время выполнения с использованием Bundle(for:)
локально для реализации платформы.
При запуске на устройстве возвращенный путь правильно указывает на расположение платформы в контейнере основного пакета приложения (в папке 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
правильно разрешен в контейнере симулятора для встроенного приложения.
Выпуск
Неправильный путь DerivedData
недоступен во время выполнения, поскольку он не является подкаталогом пакета приложения. Это делает невозможным динамическое определение требуемого имени файла GKScene
initializer во время выполнения при использовании Тренажер.
Контекст
Следующий удобный инициализатор:
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, и инициализатор завершится ошибкой, потому что требует путь, который будет подпуть "Main Bundle"