iOS универсальный фреймворк с архитектурами iphoneos и iphonesimulator

xcodebuild может построить проект с SDK, установленным либо iphoneos или же iphonesimulator но не оба, поэтому для того, чтобы создать структуру, содержащую armv7 arm64 а также i386 x86_64 архитектуры, я должен бежать xcodebuild дважды, а затем использовать lipo объединить все архитектуры в один универсальный двоичный файл. Я вижу коммерческую структуру, которая делает это, но это приводит к неправильному info.plist файл, потому что у него есть поле, CFBundleSupportedPlatforms и все знаки указывают на это, содержащее только 1 значение, например, CFBundleSupportedPlatforms = ( "iPhoneSimulator" ),

Похоже на lipo не должны использоваться таким образом, потому что это официально не поддерживается xcodebuld, Есть ли лучший способ построить каркас, содержащий все архитектуры?

1 ответ

Решение

Я следую за вопросом, но полагаю, я немного озадачен, почему вы хотите излишне раздуть одну .framework с только для симуляторов срезов i386 и x84_64, которые действительно имеют отношение только к вашей сборке разработки. Вы бы случайно захотели раздать фреймворк другим разработчикам и хотите, чтобы он работал как на симуляторе, так и на устройстве?

Если это так, вы находитесь на правильном пути с использованием lipo объединить тонкие двоичные файлы для устройства вместе или объединить тонкие двоичные файлы для симулятора вместе, но не следует пытаться создавать единственное устройство и структуру симулятора. Руководство Apple использует SDK и Frameworks. В XCode есть два различных SDK платформы - iPhoneOS.platform и iPhoneSimulator.platform, которые содержат SDK только с срезами для соответствующих целевых архитектур:

Опции платформы XCode

Вы можете углубиться в каждую из этих папок и обнаружить, что платформы UIKit действительно следуют идее для каждой платформы и условно связаны на основе используемого SDK:

UIKit Lipo

Кроме того, я бы предположил, что вы хотели иметь одну универсальную, полностью архитектурную среду, чтобы разработчикам-потребителям не приходилось не забывать менять один файл.framework на другой в зависимости от того, как они компилировали приложение. Хорошей новостью является то, что вы можете использовать флаги условного связывания, чтобы иметь возможность влиять на это без необходимости перестановки файловой системы!

Поскольку люди принимают вашу библиотеку, частью установки должно быть использование условного связывания - в пределах OTHER_LINKER_FLAGS Вы можете выбрать параметры сборки для каждой конфигурации (Debug, Release, Ad-Hoc и т. д.), а также для каждой архитектуры или SDK:

Другие флаги линкера

Чтобы получить доступ к этим специфичным для SDK настройкам, вам нужно нажать + рядом с каждой из ваших конфигураций сборки, где вы хотите настроить привязку каркаса. Затем вы можете выбрать соответствующие SDK из выпадающего списка и добавить свои флаги компоновщика для каждой из двух целевых платформ.

Другие вопросы по тегам