Почему путь к комплекту фреймворка разрешается в каталог сборки DerivedData при нацеливании на Simulator? - PullRequest
0 голосов
/ 14 июня 2019

Расхождение

Продукт подпроекта рабочей области 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"

1 Ответ

1 голос
/ 16 июня 2019

При запуске из XCode XCode устанавливает DYLD_FRAMEWORK_PATH и DYLD_LIBRARY_PATH в путь продуктов сборки, так что связь выполняется с вашими построенными средами при выполнении тестов против них.

Это было достаточно долгое время вXcode.Если вы «запускаете» его из SpringBoard, вы должны получить то поведение, которое вам нужно.

...