web-dev-qa-db-fra.com

Vérifier et supprimer une architecture non prise en charge [x86_64, i386] dans IPA / Archive

Problème:

Lors de la soumission de l'application sur l'App Store, l'erreur suivante est signalée:

Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]

Des questions:

  1. Comment l'erreur ci-dessus peut-elle être résolue?

  2. Comment puis-je vérifier les architectures utilisées par l'archive ou l'IPA?

  3. Comment puis-je m'assurer que l'archive Release n'inclut pas x86_64 et i386 _ (architectures de simulateur).

    • Est-ce uniquement possible par script ou existe-t-il un paramètre dans Build Settings ou bien où?
30
user1046037

Apple a commencé à se plaindre si l'application contient des architectures de simulateur pendant la distribution.

Comment l'erreur ci-dessus peut-elle être résolue?

Solution:

Ajoutez ci-dessous le code dans le script d’exécution de Project target, cela supprime l’architecture du simulateur (x86_64 et i386) de votre application lors du processus de construction:

Shell:

/bin/sh

Code:

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

Solution:

Il y a encore une solution , si vous ne souhaitez le faire qu’une seule fois. Mais faites attention, car après avoir suivi les étapes suivantes, vous ne pourrez pas exécuter d’application sur simulateur. Faites-le juste avant de déployer l'application sur Testflight/App-store.

Accédez au dossier ProjectFramework.framework de votre projet à partir du terminal. Exécutez les commandes suivantes:

lipo -remove i386 ProjectFramework_SDK -o ProjectFramework_SDK 
lipo -remove x86_64 ProjectFramework_SDK -o ProjectFramework_SDK

Vérifier les architectures du framework?

$ lipo -info PathToProject/ProjectName.framework/ProjectName

La sortie sera: → Les architectures du fichier fat: ProjectName sont: i386 x86_64 armv7 arm64

Réf. doc: http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/

79
nikdange_me

Pour le cadre dynamique créé sur mesure

  1. Terminal ouvert

  2. Ouvrez le chemin de glissement de votre projet du framework respectif vers Terminal

    Par exemple, cd /Users/mahipal/Desktop/masterTest/Alamofire.framework

  3. Définissez votre nom de cadre dans la commande ci-dessous et lancez

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

8
MAhipal Singh

En utilisant le script de nikdange_me, j'ai eu:

error: exportArchive: ipatool failed with an exception: #<CmdSpec::NonZeroExcitException: ... >
error: Framework not found in dylib search path

Alors je l'ai modifié et utilisé lipo -remove au lieu de lipo -extract et lipo -create qui a résolu mon problème:

# This script loops through the frameworks embedded in the application 
# and removes unused architectures.

find "${TARGET_BUILD_DIR}/${WRAPPER_NAME}" -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"
    for Arch in $(lipo -archs $FRAMEWORK_EXECUTABLE_PATH); do
        if ! printf '%s\n' ${ARCHS[@]} | egrep -q "^$Arch$"; then
            lipo -remove $Arch "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH" 
        fi
    done
done
0
Henrik Lineholm