Поэтому я пытаюсь использовать API важными. Когда я архив приложение и проверять их, то нет вопросов, но когда я представить его в App Store, то это дает мне следующие вопросы.
Проблема в том, что в рамках покупки содержит сборки тренажера (x86_64) и реальных устройств (рукоятки).
Конечно, вы не'т позволил представить магазин приложений бинарных для неподдерживаемого архитектуры, поэтому решение, чтобы "вручную" и удалить ненужные архитектуры конечный двоичный файл, перед отправкой.
Дэниел Кеннет придумал хорошее решение и предоставляет этот скрипт, чтобы добавить на этапе сборки:
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
Я использовал его и он работал отлично.
Редактировать: убедитесь, что вы посмотрите на измененный сценарий написал Varrry, как у этого есть некоторые незначительные проблемы.
Ответ дано pAkY88 работает, но я столкнулся с той же проблемой, Марио Гузман в https://stackoverflow.com/a/35240555/5272316: после того, как мы отрезали неиспользованный архитектуры мы можем'т запустить скрипт, т. к. он пытается удалить не существующие фрагменты, потому что в Xcode не'т ре-добавьте бинарных в любое время. Идея была - просто удалить i386 и x86_64 кусочки, когда здание для архива, поэтому я модифицировал скрипт:
echo "Target architectures: $ARCHS"
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"
# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
echo "No need to remove archs"
;;
*)
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
echo "i386 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
echo "x86_64 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
;;
esac
echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
done
Этот скрипт просто удаляет i386 и x86_64 кусочки из жира, бинарные (если они существуют), если работает не на симулятор (т. е. папку это'т, как и"отладка-iphonesimulator и").
К сожалению, я'м не знакомы с shell-скрипты, так что может быть кто-то мог написать это более элегантный способ. Но он работает)
Если вы're, используя Карфаген, то данная проблема может возникать, потому что проект:
Карфаген копия-фреймворков
построить участок.Это действие фильтров рамок в список допустимых архитектур (code).
От здания Карфагена за шаги на iOS](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos):
на ваше приложение мишень “построить фаз разделе” Настройки, нажмите на “ + значок” и выбрать “новый этап” скрипт "выполнить". Создайте скрипт в > в котором вы указываете свои оболочки (например, Бен/ш), добавьте следующее содержимое > в области приведенный ниже скрипт оболочки:
`/usr/местные/Бен/Карфаген копия-систем.
> и добавить пути к фреймворкам, которые вы хотите использовать в разделе “входные файлы”, например:
и GT;
$(SRCROOT)/Карфаген/строить/иос/коробка.база
и GT;$(SRCROOT)/Карфаген/строить/иос/результат.база
и GT;$(SRCROOT)/Карфаген/строить/иос/ReactiveCocoa.база
этот скрипт работает приложение отправки в магазин ошибка вызвана универсальный программы и гарантирует, что необходимые биткода-связанных файлов и dSYMs копируются при архивировании.
Я устранена ошибка ITMS-90080, удаляя рамки (отличный SVProgressHUD) из раздела внедренных двоичных файлов (цель -&Xcode для моделей GT; вкладка "Общие").
Если вы используете Карфаген
убедитесь, что ваш добавьте рамки
этап построения
до Карфаген
`копировать-систем.
В некоторых редких случаях (например: Лотти-iOS фреймворк):
он будет у вас просто в "Библиотека" и как обычно.
Но надо и явно добавить его в "Добавьте рамки-то" (хотя это кажется бессмысленным, поскольку он отлично работает, когда у вас это только в "Добавьте рамки", у),
и поставить в копию-фреймворков
и обеспечить копия-фреймворков после и"Добавьте рамки"и
Удалить [x86_64 С, для i386] в рамках использования ниже шага. [x86_64 С, для i386] используется для симулятор.
Откройте "Терминал"
откройте перетащите путь проекта соответствующих рамок для терминала
например: диск С /Пользователи/МАК/рабочий стол/мой проект/Alamofire.база`
Липо -удалить i386 с Alamofire -о Alamofire && Липо -удалить x86_64 с Alamofire -о Alamofire
Я добавить мои 2 цента здесь (в менее страшные слова :-). Я встречал достаточно большое количество жира библиотек от поставщиков, которые (почему-то) не работают обычным способом, добавляя их в каталог основы
как документально Яблоко. Только так мы смогли заставить их работать это вытащить .право framekwork
в каталог проекта и увязка встроенные механизмы " и " бинарные связь с библиотеками вручную в настройках сборки. Это кажется, однако работал без каких-либо проблем, как и с любым жиром библиотеку они приходят с посторонними симулятор архитекторов для i386 и x86_64 С
наряду с архитектурой "рычага".
Быстрый способ для проверки архитектуры на жировой библиотека
$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`
Который должен плюнуть выходе что-то вроде этого
Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64
Это подтверждает, что вам нужно, чтобы "обрезать жир и" (а именно для i386
& x86_64 С
) от основы до iTunesConnect архивные загрузки, который не'т допустить этих архитектур (так как они не поддерживаются для iOS).
Теперь ответы на все вопросы (или по крайней мере ответы на некоторые вопросы) вот обеспечить эти замечательные запуска сценариев, которые, я уверен, работает очень хорошо, но только если ваша база находится в директории рамок
. Теперь, если вы не shell-скрипт, наркоман, эти скрипты без изменений, выиграл't работа для сценария, я объяснить выше. Однако, существует очень простой способ, чтобы избавиться от архитектуры i386
& `архитектуру x86_64 архитектуру из рамок.
диск YourProjectDir/Ваш_проект/сайт yourlibrary.база`
$ МВ сайт yourlibrary YourLibrary_all_archs
$ Липо -удалить x86_64 с YourLibrary_all_archs -о YourLibrary_some_archs
$ Липо -удалить i386 в YourLibrary_some_archs -о сайт yourlibrary
$ РМ YourLibrary_all_archs YourLibrary_some_archs
Несколько вещей, чтобы отметить здесь - Липо -удалить
должна быть выполнена один раз для каждой архитектуры удалить. липосакция
не измените входной файл, он только создает файл, так что вы должны запустить Липо -удалить
раз на архитектуру x86_64 и i386 с
. Приведенные выше команды-это просто делаешь, что сначала переименовав исполняемый файл, а потом извлекать нужные арки, а потом убирать оставшиеся файлы. И что'ы это, вы должны увидеть зеленую галочку в приложения Затяжелителя архивных загрузить на iTunesConnect.
Имейте в виду : вышеуказанные действия следует выполнять только во время производства, так как .рамки будут удалены от симулятор архитектур, строит на тренажерах перестанет работать (что и ожидалось). В среде разработки, нет необходимости зачищать архитектур прочь.файл базы
так как вы хотите, чтобы иметь возможность проверить на оба симулятора и физическое устройство. Если ваши жировые библиотека находится в папке рамки
в проекте, то, пожалуйста, посмотрите на принятый ответ.
Я имел же проблема, даже после добавления скрипт и обновляет базу несколько раз.
Убедитесь, что в Xcode скрипт добавляется в конце, после размещения. Я думаю, что я случайно переместил скрипт до встроенных рамок.
Примечание: у меня есть Xcode 9.1
обновлено для Xcode 10.1, ниже Решение работает для меня :
Просто вы должны удалить Framework от внедренных двоичных файлов и просто добавить его в связанных фреймворков и библиотек.
Смотрите ниже скриншот;
Этот вопрос был решен для меня, слегка изменяя запустить скрипт из pAky88'ы ответа и выполнения после внедрения рамок. Также обязательно снимите флажок "и запустить скрипт только при установке на".
/usr/local/bin/carthage copy-frameworks
#!/usr/bin/env bash
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
if [ ! -f "${FRAMEWORK_EXECUTABLE_PATH}" ]; then
continue
fi
if xcrun lipo -info "${FRAMEWORK_EXECUTABLE_PATH}" | grep --silent "Non-fat"; then
echo "Framework non-fat, skipping: $FRAMEWORK_EXECUTABLE_NAME"
continue
fi
echo "Thinning framework $FRAMEWORK_EXECUTABLE_NAME"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
xcrun lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
xcrun lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
Я снял архитектурах i386 & x64_86 от настройки сборки - действительный архитектур - релиз, и все работало просто отлично.
Теперь единственной проблемой будет то, что вы можете'т выполнение выпуск создание для целей тестирования на симулятор. Но как легко, как вы удалили арки, вы можете добавить их обратно, если вы хотите.
Спасибо всем выше ответы. Вот скрипт работает с Свифт 4.2 и 5
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
FRAMEWORK_NAME="Your_Framework_Name.framework"
# Check if Framework is present.
FRAMEWORK_LOCATION=$(find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d)
if [ -z $FRAMEWORK_LOCATION ]; then
echo "Couldn't find Your_Framework_Name.framework in $APP_PATH. Make sure 'Embed Frameworks' build phase is listed before the 'Strip Unused Architectures' build phase."
exit 1
fi
# This script strips unused architectures
find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
самое простое решение, что работал для меня было
1 - удалить Framework из встроенных рамок.
2 - Добавить рамки как рамки
молодец!
У меня был тот же вопрос. Даже он не работает после добавления данного запустите скрипт. Это был вопрос в Xcode, связанные. Я использовал версию Xcode Версии 9.0, но последняя версия была 9.2.
Так что я установил последний Xcode (9.2) и он работал.
Эта ошибка (ITMS-90240) также может быть вызвана статическим (.библиотека). вот скрипт для прокладки избыточных архитектур. В Xcode добавить к целевой > BuildPhases и GT; нажмите на + и выберите пункт выполнить скрипт. Затем вставить его в поле "скрипт".
Скрипт ищет .файлы, проверяет, чтобы увидеть, если она содержит оскорбления архитектуры, а если это делает новый .файл без этой архитектуры.
Для macOS:
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="armv7 armv7s arm64"
for t in $STRIPARCHS
do
if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi
done
exit 0
Для iOS :
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="x86_64 i386"
for t in $STRIPARCHS
do
if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi
done
exit 0
Ваш фреймворк содержит как рука
и `для x86 код, что позволяет использовать его на устройстве или на тренажере. Если вы собираетесь отправить свое приложение в магазин приложений, выполните следующий сценарий, чтобы лишить активен код от двоичного.
1.Выберите вашу цель в навигаторе проекта, и нажмите кнопку этапы сборки в верхней части редактора проекта.
2.В меню редактора выберите "Добавить" построить этап, затем добавьте выполните этап построения сценария (или нажмите кнопку " + " в верхнем левом углу редактора построить фаз).
3.Разверните треугольник рядом с новой запустить скрипт этап построения, которые только что добавили. В окне Редактор скрипта, вставьте следующее: Баш
${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/"YourframeworkName.framework"/strip-frameworks.sh
Вот скрипт, я специально удалять только одна платформа'ы архитектуры из исполняемого файла.
``Баш
FRAMEWORK_EXECUTABLE_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Frameworks/YourApp.framework/YourApp"
Эхо "$FRAMEWORK_EXECUTABLE_PATH и"
КП " в FRAMEWORK_EXECUTABLE_PATH на"$; на "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"и
Эхо "выполнив следующую команду, чтобы удалить x86_64 с аркой из базы YourApp исполняемый"и Эхо "Липо -удалить \на" архитектуру x86_64;\&я$FRAMEWORK_EXECUTABLE_PATH; -о \" и я_X86_64${FRAMEWORK_EXECUTABLE_PATH}&; на"
Липо -снять архитектуру x86_64 " и _X86_64${FRAMEWORK_EXECUTABLE_PATH}себе" -О " и$FRAMEWORK_EXECUTABLE_PATH"и
_X86_64 я РМ " и${FRAMEWORK_EXECUTABLE_PATH}&;
``
Добавить этот скрипт в своих проектах "и построение этапов" из вашего проекта целевыми. Будьте уверены, чтобы проверить поле: "и запустить скрипт только при установке"и