Если память мне не изменяет, так как 6-я версия Xcode не поддерживает так называемые «универсальные» фреймворки (фреймворки, которые содержат архитектуры для arm
-семейства и x86_64
/ i386)
. Так что теперь, когда выпостроить фреймворк Xcode создаст два отдельных пакета для iphoneos и iphonesimulator (вы можете найти их в соответствующих папках в вашей папке производных данных). Архитектура, которую будут содержать эти фреймворки, зависит от переменной ARCHS
. По умолчанию этоустановите значение $ARCHS_STANDARD
, которое варьируется в зависимости от платформы. Вы можете поиграть с этим параметром, смешивая архитектуры, которые вам действительно нужны, но Xcode потерпит неудачу во время сборки, если эти архитектуры несовместимы (предположительно x86_64
и arm
-семейные архитектуры считаются несовместимыми.)
Чтобы обойти это ограничение, вам действительно нужно немного «усердно работать» самостоятельно и «объединять» пакеты фреймворков для симуляторов и устройств вручную.
1. Создайте свой фреймворк для устройства и симулятора iOS
Здесь нет ничего сложного, просто перейдите к настройкам целевой сборки и убедитесь, что для параметра " Build Active Architecture Only " (ONLY_ACTIVE_ARCH
) установлено значение NO
и добавьте все необходимыеархитектуры для " Действительных архитектур " (VALID_ARCHS
, вы уже сделали это):
Теперь создайте свою платформу, найдите файл комплекта в группе продуктов в XCode и откройте его в Finder:
Вы должны найти две папки,по одному на каждый набор архитектур:
2.Объедините две рамки в одну
Теперь перейдите в папку Debug-iphoneos
, скопируйте оттуда структуру и вставьте ее куда-нибудь еще, например в родительскую папку:
Он будет содержать нашу универсальную структуру в ближайшее время.Для этого нам нужно сначала создать универсальную динамическую библиотеку с помощью инструмента lipo
.Откройте терминал, перейдите в папку, в которой вы сейчас находитесь (с скопированным файлом инфраструктуры), и введите следующее:
$ lipo -create -output 'MyFramework' 'Debug-iphoneos/MyFramework.framework/MyFramework' 'Debug-iphonesimulators/MyFramework.framework/MyFramework'
Если вы не находитесь в папке производных данных, ваши пути к библиотекам инфраструктуры будут отличаться откурс.Эта команда создаст новую универсальную библиотеку, содержащую оба набора архитектур.Теперь просто перетащите его в свой пакет фреймворка и замените существующий.
Вероятно, у вашего фреймворка есть фрагменты архитектуры в папке типа MyFramework.framework/Modules/MyFramework.swiftmodule
.Наша универсальная структура должна иметь срезы для всех поддерживаемых архитектур.Внутри у вас уже должны быть кусочки arm
, так как мы скопировали наш фреймворк из папки Debug-iphoneos
, поэтому просто найдите ту же папку для Debug-iphonesimulator
и скопируйте файлы из папки в папку целевого фреймворка.Теперь эта папка должна выглядеть примерно так:
Вот и все!Теперь у вас есть универсальный фреймворк, который должен корректно работать как на симуляторе iOS, так и на устройстве iOS.
3.Разделите ваш фреймворк при отправке в Appstore
Если вы попытаетесь подать заявку вместе с универсальным фреймворком, оно будет автоматически отклонено .Поэтому перед отправкой вам нужно будет извлекать только архитектуры устройств одну за другой, а затем объединять их в одну среду, используя lipo
:
$lipo -extract 'arm' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm'
$lipo -extract 'arm64' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm64'
$lipo -create -output 'MyFramework' 'MyFramework-arm' 'MyFramework-arm64'
Затем скопируйте ее в свою среду и удалите лишние фрагменты.
PS
Надеюсь, это поможет, однако это довольно известная проблема, и в Интернете уже есть множество решений.Я предлагаю вам погуглить такие термины, как «Создание толстой / универсальной платформы iOS», и я полагаю, что вы найдете множество рабочих скриптов, которые сделают все это за вас. Здесь - это один из наиболее полезных для меня.