Ошибки при создании проекта Xcode после добавления в Run Script фатальной ошибки: lipo: входной файл

У меня были следующие ошибки при попытке загрузить мое приложение в App Store. ERROR ITMS-90087, ERROR ITMS-90209 и ERROR ITMS-90125, как указано в этом вопросе Отправить в App Store issues: Unsupported Architecture x86 и использовал показанный ниже сценарий, чтобы попытаться решить проблему:

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

Теперь я получаю много ошибок, пытаясь скомпилировать свой код в Xcode.

Executable is /Users/[Username]/Library/Developer/Xcode/DerivedData/[AppName]-egnqksafjoylrcaxerbjrknmxdgl/Build/Products/Debug-iphoneos/[AppName].app/Frameworks/Bolts.framework/Bolts
Extracting arm64 from Bolts

fatal error: lipo: input file (/Users/[Username]/Library/Developer/Xcode/DerivedData/[AppName]-egnqksafjoylrcaxerbjrknmxdgl/Build/Products/Debug-iphoneos/[AppName].app/Frameworks/Bolts.framework/Bolts) must be a fat file when the -extract option is specified

Merging extracted architectures: arm64
fatal error: lipo: can't open input file: /Users/[Username]/Library/Developer/Xcode/DerivedData/[AppName]-egnqksafjoylrcaxerbjrknmxdgl/Build/Products/Debug-iphoneos/[AppName].app/Frameworks/Bolts.framework/Bolts-arm64 (No such file or directory)

rm: /Users/[Username]/Library/Developer/Xcode/DerivedData/[AppName]-egnqksafjoylrcaxerbjrknmxdgl/Build/Products/Debug-iphoneos/[AppName].app/Frameworks/Bolts.framework/Bolts-arm64: No such file or directory

Replacing original executable with thinned version
mv: rename /Users/[Username]/Library/Developer/Xcode/DerivedData/[AppName]-egnqksafjoylrcaxerbjrknmxdgl/Build/Products/Debug-iphoneos/[AppName].app/Frameworks/Bolts.framework/Bolts-merged to /Users/[Username]/Library/Developer/Xcode/DerivedData/[AppName]-egnqksafjoylrcaxerbjrknmxdgl/Build/Products/Debug-iphoneos/[AppName].app/Frameworks/Bolts.framework/Bolts: No such file or directory

Есть идеи, как исправить?


person SamoanProgrammer    schedule 06.02.2016    source источник


Ответы (3)


Что ж, похоже, что структура Bolts не является толстым двоичным файлом (т.е.не содержит двоичных файлов с несколькими архитектурами), поэтому извлечение и слияние не удается. Я предполагаю, что самым простым решением будет запуск сценария только для определенных фреймворков, который поставляется с двоичным файлом для архитектуры x86_64. Вы можете идентифицировать толстые двоичные файлы с помощью команды file.

person Daniel Lahyani    schedule 06.02.2016
comment
Прочитав это, я понял, что, поскольку проблема с загрузкой в ​​App Store вызывала только один фреймворк, то это должен быть только фреймворк, на котором мне нужно запустить скрипт. Итак, я изменил строку в скрипте find $ APP_PATH -name '* .framework' -type d | при чтении -r FRAMEWORK для ссылки только на одну структуру, вызывающую ошибку, т.е. найдите $ APP_PATH -name '[frameworkname] .framework' -type d | при чтении -r РАМКА - person SamoanProgrammer; 06.02.2016
comment
Также исправлена ​​моя проблема с запуском скрипта только для конкретной платформы, для которой вы получаете ошибку x86_64. - person AtWork; 15.07.2016
comment
Для меня приведенный выше сценарий будет работать с первой попытки. Впоследствии я получаю сообщение об ошибке, в котором говорится, что он пытается удалить срезы для архитектур, которых нет. Я могу заставить его снова работать тогда и только тогда, когда я использую команду «Очистить» в Xcode (Shift + Command + K). Когда я нажимаю Build или Run, он снова работает. Есть идеи, как обойти эту проблему? - person Mario A Guzman; 30.07.2016
comment
Комментарий SamoanProgrammer - это решение. Марио мне тоже пришлось убирать и строить. - person kareem; 01.09.2016
comment
Есть идеи, как изменить это, если у вас есть две структуры, вызывающие проблемы? - person Jake T.; 16.05.2017
comment
@JakeT. см. ответ, который я добавил в основную ветку. Я добавил дополнительную проверку, чтобы обойти проблему с несколькими фреймворками. - person Jereme; 28.06.2017

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

#!/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
person Jereme    schedule 28.06.2017

А как насчет того, чтобы просто установить флажок «Запускать скрипт только при установке»?

person Rivera    schedule 17.02.2017
comment
У меня это сработало, но я боюсь каких-либо проблем при развертывании приложения в магазине приложений. - person Nasir; 30.12.2017