Проблемы с App Store: неподдерживаемая архитектура x86

253

Поэтому я пытаюсь использовать Shopify API. Когда я архивирую приложение и проверяю его, проблем не возникает, но когда я отправляю его в магазин приложений, возникают следующие проблемы.

  1. ОШИБКА ITMS-90087: «Неподдерживаемая архитектура. Ваш исполняемый файл содержит неподдерживаемую архитектуру« [x86_64, i386] »."
  2. ОШИБКА ITMS-90209: «Неверное выравнивание сегмента. Двоичный файл приложения на SJAPP.app/Frameworks/Buy.framework/Buy не имеет правильного выравнивания сегмента. Попробуйте перестроить приложение с последней версией Xcode». (Я уже использую последнюю версию.)
  3. ОШИБКА ITMS-90125: «Двоичный файл недействителен. Информация шифрования в команде загрузки LC_ENCRYPTION_INFO либо отсутствует, либо недействительна, либо двоичный файл уже зашифрован. Похоже, этот двоичный файл не был создан с помощью компоновщика Apple».
  4. ПРЕДУПРЕЖДЕНИЕ ITMS-90080: «Исполняемая полезная нагрузка /..../ Buy.framework не является позиционно-независимым исполняемым файлом. Пожалуйста, убедитесь, что настройки сборки сконфигурированы для создания исполняемых файлов PIE».
Саурабх Джайн
источник
4
Первое сообщение звучит так, как будто это симулятор.
Филип Миллс
Когда я создаю архив для отправки, я выбираю устройства iOS в опциях устройств, затем создаю архив, если это то, о чем вы спрашиваете
Saurabh Jain
2
Я согласен с @PhillipMills. Сконцентрируйтесь на своей первой ошибке. Почему в вашем приложении iOS есть двоичный файл x86_64? Либо вы сделали что-то странное с настройками сборки ... либо загрузили сборку симулятора.
Стивен Дарлингтон
@ pAkY88. Я не смог. Я недавно писал на форуме Shopify API и жду ответа. Обязательно опубликую что-нибудь, если я столкнусь с одним из них
Saurabh Jain
У меня было такое поведение, когда я загрузил с помощью Application Loader 3.5
SudoPlz

Ответы:

395

Проблема заключается в том, что платформа Buy содержит сборку как для симулятора (x86_64), так и для реальных устройств (ARM).

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

Даниэль Кеннетт придумал хорошее решение и предоставляет этот сценарий для добавления на этапе сборки:

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
источник
6
@ pAkY88 Я использовал этот скрипт в своем проекте Xcode, чтобы исправить проблемы App Store, упомянутые выше, но теперь, когда я перехожу к Build, у меня много фатальных ошибок -> фатальная ошибка: lipo: input file (/ ... Frameworks / Bolts.framework / Bolts) должен быть толстым файлом, если указана опция -extract. Любые идеи, как это исправить?
SamoanProgrammer
52
Я думаю, что это довольно глупо: вам нужно объединить arm + x86, чтобы ваше приложение работало как на симуляторе, так и на устройстве, и вы должны раздеть x86 для отправки в магазин приложений. Почему Apple не делает полоски на своих концах, пока обнаружен x86? Они могут помочь множеству технических причин, чтобы защитить это, но ни одна деловая причина, так как это совсем не удобно для пользователя.
superarts.org
5
@Skoua Выберите соответствующую цель, затем «Фазы сборки» и поместите ее после действия «Вставить рамки»
Петр Тобольский
6
Вышеприведенный скрипт полезен, но нигде не упоминается о шагах по запуску скрипта в Xcode. Чтобы запустить этот сценарий, перейдите к TARGETS -> выберите этапы сборки, затем верхний заголовок в Xcode нажмите на редактор -> добавить этапы сборки -> добавить сценарий выполнения, выполните этапы сборки, и вы получите столбец в разделе этапов сборки TARGET. Здесь вы можете скопировать приведенный выше скрипт и успешно загрузить его в Appstore.
Шаши Гупта
5
Не работает в Xcode 11.2 - кто-нибудь нашел решение?
JMIT
180

Ответ от 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 из толстого бинарного файла (если они существуют), если работает не для симулятора (это означает, что папка назначения не похожа на «Debug-iphonesimulator»).

Извините, я не знаком со скриптами оболочки, так что, возможно, кто-то мог бы написать это более элегантным способом. Но это работает)

Varrry
источник
1
Спасибо за идею. Я просто добавил проверку в код из принятого ответа в цикле while, case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacи это сработало как шарм.
Михаил Радионов
Я добавляю этот скрипт, TARGET -> Build Phases -> [CP] Embedded Pods Frameworksно он не работает, и у меня все еще есть ошибки загрузки в iTunesConnect. Как запустить этот скрипт?
PiterPan
2
PiterPan, добавьте его как отдельную фазу
RunScript
1
Я только что проверил опцию «Запускать скрипт только при установке», и он пропускается, кроме как после архивации.
Ривера
Сделал все предложенное здесь, сумел очистить Карфагенскую ошибку; но нужно было загрузить его в App Store без проверки, чтобы получить полезную информацию о том, почему это не удалось.
Удалось
90

Если вы используете Карфаген, вы можете столкнуться с этой проблемой, потому что проект:

  • Отсутствует carthage copy-frameworksфаза сборки.
  • Или фаза сборки не включает в себя все фреймворки (неполный список).

Это действие фильтрует фреймворки в список допустимых архитектур (код) .

Настройка фазы сборки copy-frameworks

Из здания Карфагена для шагов iOS :

На вкладке настроек «Фазы сборки» целевого приложения нажмите значок «+» и выберите «Фаза запуска нового скрипта». Создайте сценарий запуска, в котором вы указываете свою оболочку (например, bin / sh), добавьте следующее содержимое в область сценария под оболочкой:

/usr/local/bin/carthage copy-frameworks

и добавьте пути к фреймворкам, которые вы хотите использовать в разделе «Входные файлы», например:

$(SRCROOT)/Carthage/Build/iOS/Box.framework $(SRCROOT)/Carthage/Build/iOS/Result.framework $(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework

Этот скрипт работает вокруг ошибки отправки в App Store, вызванной универсальными двоичными файлами, и обеспечивает копирование необходимых файлов, связанных с битовым кодом, и dSYM при архивировании.

odlp
источник
Как дополнительное примечание, я недавно столкнулся с этой проблемой, переключившись со старой, предварительно скомпилированной версии стороннего фреймворка на новую версию того же фреймворка, установленного с использованием Carthage. Даже после того, как Карфаген был полностью настроен, я продолжал получать эту ошибку. Для меня исправлением было полностью удалить фреймворк из проекта и добавить его снова. Если вы используете Карфаген, и этот ответ не поможет вам, попробуйте это сделать.
Эш
1
Действительно, отличный пост. Обратите внимание, что часто лучше всего просто удалить все фреймворки и начать заново добавлять все фреймворки из Карфагена. Приветствия
Толстяк
Я использую Карфаген и Маршал и добавляю $(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkпроделанную работу
Рикардо Мутти
в современной iOS в 99% случаев это проблема - вы просто забыли копирование фреймворков. (100% проектов сейчас используют Карфаген.)
Толстяк
41

Я исправил ошибку ITMS-90080, удалив фреймворк (отличный SVProgressHUD) из раздела Embedded Binaries (цель XCode -> вкладка General).

введите описание изображения здесь

Барт ван Куйк
источник
5
Этот ответ должен иметь гораздо больше голосов. Я подозреваю, что это коренная причина для многих людей, использующих Карфаген.
mm2001
15
Если вы пытаетесь встроить динамический фреймворк, то удаление его приведет к появлению для меня этого сообщения об ошибке: «Причина: изображение не найдено»
Electronix384128
1
Это сработало для меня. Вы должны удалить фреймворк из Embedded Binaries и просто добавить его в связанные фреймворки и библиотеки. Кроме того, вы должны сделать другие вещи, такие как запуск сценария, который вы найдете в других ответах.
smileBot
33

Если вы используете, Carthageубедитесь, что вы Embed Frameworks Build StepдоCarthage copy-frameworks


В некоторых необычных случаях (пример: платформа Lottie-iOS):

  • у вас это будет просто в "Библиотеке ссылок", как обычно.

  • Однако вы должны также явно добавить его в «Вставить рамочные» (несмотря на то, что кажется бессмысленным, так как она прекрасно работает , когда у вас есть только в «Embed рамочные»),

  • и положить его в копи-фреймворки

  • и убедитесь, что копирование фреймворков после "Вставить фреймворки"

Maciej Swic
источник
Таким образом, моя проблема. Спасибо.
DookieMan
15

Удалите [x86_64, i386] из каркаса, используя шаг ниже. [x86_64, i386] используется для симулятора.

  1. открыто Terminal

  2. откройте путь перетаскивания вашего проекта соответствующей платформы в терминал

    пример : cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. установите имя вашей платформы в приведенной ниже команде и запустите

lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire

  1. Теперь снова откройте свой проект, очистите, создайте и запустите и создайте архив ...
Махапал Сингх
источник
@mahipal Singh .. после удаления с помощью команды lipo. приложение не работает в симуляторе. Ошибка симулятора x84_64 отсутствует для симулятора iphone. но работает нормально в реальном устройстве.
Hitarth
Это потому, что симулятор поддерживает только отладочный фреймворк
MAhipal Singh
14

Я добавлю свои 2 цента здесь (менее страшно :-). Я встречал довольно много толстых библиотек от поставщиков, которые (по какой-то причине) не работают обычным образом, добавляя их в Frameworksкаталог, как описано в Apple. Единственный способ заставить их работать, это потянуть .framekworkвправо в каталог проекта и связать Embedded Frameworksи Link Binary with Librariesвручную в настройках сборки. Однако, похоже, это работало без проблем, так как с любой толстой библиотекой они идут с посторонними архитектурами симулятора i386 и x86_64вместе с armархитектурами.

Быстрый способ проверить архитектуру в толстой библиотеке

$ 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).

Теперь все ответы (или, по крайней мере, некоторые из ответов) здесь предоставляют эти замечательные Run Scripts, которые, я уверен, работают действительно хорошо, но только если ваша Framework находится в Frameworksкаталоге. Теперь, если вы не любитель сценариев оболочки, эти сценарии без изменений не будут работать для сценария, который я объяснил выше. Тем не менее, существует очень простой способ избавиться от i386& x86_64архитектуры из фреймворка.

  1. Откройте терминал в каталоге вашего проекта.

  2. Изменить каталог прямо в .framekwork, как

    cd YourProjectDir/YourProject/YourLibrary.framework

  3. Запустите серию команд, как показано ниже:

$ mv YourLibrary YourLibrary_all_archs
$ lipo -remove x86_64 YourLibrary_all_archs -o YourLibrary_some_archs
$ lipo -remove i386 YourLibrary_some_archs -o YourLibrary
$ rm YourLibrary_all_archs YourLibrary_some_archs

Несколько вещей, на которые следует обратить внимание, - lipo -removeэто необходимо сделать один раз для удаления каждой архитектуры. lipoне изменяет входной файл, он создает только файл, поэтому вам нужно запустить его lipo -removeодин раз x86_64и i386. Приведенные выше команды просто делают это, сначала переименовывая исполняемый файл, а затем, в конце концов, удаляя нужные архивы, а затем убирая оставшиеся файлы. И все, теперь вы должны увидеть зеленую галочку при загрузке приложения Application Loader Archival в iTunesConnect.

Что нужно иметь в виду : вышеупомянутые шаги должны быть выполнены только во время производственной сборки, так как сборки .frameworkбудут удалены из архитектур симулятора, сборки на симуляторах перестанут работать (что ожидается). В среде разработки не должно быть необходимости удалять архитектуру .frameworkфайла, поскольку вы хотите иметь возможность проводить тестирование как на симуляторе, так и на физическом устройстве. Если ваша толстая библиотека находится в Frameworksпапке в проекте, пожалуйста, посмотрите на принятый ответ.

AnBisw
источник
Простое решение для тех, кто не хочет писать сценарии.
просто запустите команду выше, размер арки уменьшен до половины. надеюсь, что-то изменить.
showmyroutes
Несмотря на то, что я развернул скрипт, чтобы все работало как обычно, но это должно быть надлежащим описанием того, как решить проблему.
Акулы Monken
люблю природу этого ответа. чистый и лаконичный
Худи Ильфельд
10

У меня была такая же проблема даже после добавления скрипта и обновления фреймворка несколько раз.

Убедитесь, что в xCode скрипт добавлен в конце после встраивания. Я думаю, что я случайно переместил скрипт перед встроенным фреймворком.

введите описание изображения здесь

Примечание: у меня есть xCode 9.1

Флорин Добре
источник
Это сработало для меня. Где только сценария @ pAkY88 было достаточно в прошлый раз, когда я делал релиз почти год назад.
RedHotPawn.com
У меня была та же проблема, и это сработало для меня. Обязательно проверяйте положение скрипта запуска каждый раз, когда фреймворк удаляется и добавляется (необходимо только при удалении только одного фреймворка).
Баран Эмре
Ты спас мой день. Просто добавить скрипт после встроенного фреймворка.
Маюри Р Талавия
8

Обновлено для Xcode 10.1, ниже решение работало для меня:

Вам просто нужно удалить фреймворк из Embedded Binaries и просто добавить его в связанные фреймворки и библиотеки.

Смотрите скриншот ниже;

введите описание изображения здесь

Киран Джадхав
источник
1
Рабочее решение для меня (у)
Alok
он удаляет то же самое из связанных структур и библиотек
Рану Дурандхар
8

Спасибо всем вышеперечисленным ответам. Вот скрипт, работающий со Swift 4.2 и 5 . Замените строку Your_Framework_Name исходным именем вашей платформы.

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
Гурджиндер Сингх
источник
Спасибо! Это сработало для меня, а принятый ответ - нет.
besserwisser
5

Эта проблема была решена для меня, слегка изменив скрипт запуска из ответа 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
объективно C
источник
4

Я удалил архитектуры i386 и x64_86 из Настройки сборки - Допустимые архитектуры - Выпуск, и все заработало просто отлично.

введите описание изображения здесь

Теперь единственная проблема заключается в том, что вы не можете запустить сборку RELEASE для тестирования на SIMULATOR . Но так же легко, как вы удалили арки, вы можете добавить их обратно, если хотите.

Михай Эрос
источник
1
ДА, это решение.
Офир Малахи
3

простое решение, которое работало для меня, было

1 - удалить рамки из встроенных рамок.

2 - добавить структуру как связанную структуру

сделано!

DeyaEldeen
источник
1

Эта ошибка (ITMS-90240) также может быть вызвана статической (.a) библиотекой. Вот сценарий, чтобы лишить лишние архитектуры. В XCode добавьте это к Target> BuildPhases> Нажмите + и выберите Run Script. Затем вставьте это в поле сценария.

Сценарий ищет файлы .a, проверяет, содержит ли он нарушающую архитектуру, а затем создает новый файл .a без этой архитектуры.

Для 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
A.Badger
источник
1

У меня была такая же проблема. Даже он не работал после добавления данного Run Script. Это была проблема, связанная с Xcode. Я использовал версию Xcode 9.0, но последняя версия была 9.2.

Поэтому я установил последнюю версию Xcode (9.2), и она заработала.

Махеш
источник
0

Ваш фреймворк содержит ARMи x86код, и это позволяет вам использовать его на устройстве или в симуляторе. Если вы собираетесь отправить свое приложение в App Store, запустите следующий скрипт, чтобы удалить неактивный код из двоичного файла.

1.Выберите цель в Навигаторе проекта и нажмите «Фазы сборки» в верхней части редактора проекта.

2. В меню «Редактор» выберите «Добавить этап сборки», затем «Добавить этап сборки сценария запуска» (или нажмите кнопку «+» в верхнем левом углу редактора этапов сборки).

3.Разверните раскрывающий треугольник рядом с новой только что добавленной фазой построения Run Script. В окне редактора сценариев вставьте следующее: bash

$ {BUILT_PRODUCTS_DIR} / $ { FRAMEWORKS_FOLDER_PATH } / "YourframeworkName.framework" /strip-frameworks.sh

Джорджкутти Радость
источник
Это предполагает, что сценарий strip-frameworks.sh оказывается там ...
Codezy
0

Вот скрипт, который я использовал, чтобы специально удалить только архитектуру одного фреймворка из исполняемого файла.

# Remove unused Framework architecture from "YourApp" framework.

FRAMEWORK_EXECUTABLE_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Frameworks/YourApp.framework/YourApp"

echo "$FRAMEWORK_EXECUTABLE_PATH"

cp "$FRAMEWORK_EXECUTABLE_PATH" "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

echo "Executing following command to remove x86_64 arch from YourApp framework executable"
echo "lipo -remove x86_64 \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"${FRAMEWORK_EXECUTABLE_PATH}_X86_64\""

lipo -remove x86_64 "${FRAMEWORK_EXECUTABLE_PATH}_X86_64" -o "$FRAMEWORK_EXECUTABLE_PATH"

rm "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

Добавьте этот скрипт в ваши проекты "Build Phases" вашего проекта. Обязательно установите флажок: «Запускать скрипт только при установке»

Предварительный просмотр, где вставить образец сценария

keaplogik
источник