Soumettre aux problèmes de l'App Store: architecture non prise en charge x86

253

J'essaie donc d'utiliser l'API Shopify. Lorsque j'archive l'application et la valide, il n'y a aucun problème, mais lorsque je la soumets à l'App Store, cela me pose les problèmes suivants.

  1. ERREUR ITMS-90087: "Architecture non prise en charge. Votre exécutable contient une architecture non prise en charge '[x86_64, i386]'."
  2. ERREUR ITMS-90209: "Alignement de segment non valide. Le binaire d'application sur SJAPP.app/Frameworks/Buy.framework/Buy n'a pas un alignement de segment approprié. Essayez de reconstruire l'application avec la dernière version de Xcode." (J'utilise déjà la dernière version.)
  3. ERREUR ITMS-90125: "Le binaire n'est pas valide. Les informations de cryptage dans la commande de chargement LC_ENCRYPTION_INFO sont manquantes ou non valides, ou le binaire est déjà crypté. Ce binaire ne semble pas avoir été construit avec l'éditeur de liens d'Apple."
  4. AVERTISSEMENT ITMS-90080: "La charge utile exécutable /..../ Buy.framework n'est pas un exécutable indépendant de la position. Veuillez vous assurer que vos paramètres de construction sont configurés pour créer des exécutables PIE."
Saurabh Jain
la source
4
Le premier message sonne comme s'il s'agissait d'une construction de simulateur.
Phillip Mills
Lorsque je crée une archive à soumettre, je choisis les appareils iOS dans les options des appareils, puis je crée une archive, si c'est ce que vous demandez
Saurabh Jain
2
Je suis d'accord avec @PhillipMills. Concentrez-vous sur votre première erreur. Pourquoi avez-vous un binaire x86_64 dans votre application iOS? Soit vous avez fait quelque chose de bizarre avec vos paramètres de build ... soit vous avez téléchargé une build Simulator.
Stephen Darlington
@ pAkY88. Je n'étais pas capable de. J'ai récemment posté sur le forum de l'API Shopify et j'attends une réponse. Publiera certainement quelque chose si j'en rencontre un
Saurabh Jain
J'ai eu ce comportement lorsque j'ai téléchargé à l'aide d'Application Loader 3.5
SudoPlz

Réponses:

395

Le problème est que le framework Buy contient une version pour le simulateur (x86_64) et les périphériques réels (ARM).

Bien sûr, vous n'êtes pas autorisé à soumettre à l'App Store un binaire pour une architecture non prise en charge, donc la solution consiste à supprimer "manuellement" les architectures inutiles du binaire final, avant de le soumettre.

Daniel Kennett a trouvé une bonne solution et fournit ce script à ajouter à la phase de construction:

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

Je l'ai utilisé et cela a parfaitement fonctionné.

EDIT: assurez-vous de regarder le script modifié publié par Varrry, car celui-ci a quelques problèmes mineurs.

pAkY88
la source
6
@ pAkY88 J'ai utilisé ce script dans mon projet Xcode pour corriger les problèmes de l'App Store mentionnés ci-dessus, mais maintenant quand je vais dans Build, j'ai beaucoup d'erreurs fatales -> erreur fatale: lipo: fichier d'entrée (/ ... Frameworks / Bolts.framework / Bolts) doit être un gros fichier lorsque l'option -extract est spécifiée. Une idée de comment réparer ça?
SamoanProgrammer
52
Je pense que c'est assez stupide: vous devez combiner bras + x86 pour permettre à votre application de fonctionner à la fois sur le simulateur et sur l'appareil, et vous devez supprimer x86 pour le soumettre à l'App Store. Pourquoi Apple ne fait pas la bande de son côté tant que x86 est détecté? Ils peuvent aider de nombreuses raisons techniques pour défendre cela, mais aucune raison commerciale car ce n'est pas du tout convivial.
superarts.org
5
@Skoua Sélectionnez la cible appropriée, puis "Build Phases" et placez-la après l'action "Embed Frameworks"
Piotr Tobolski
6
Le script ci-dessus est utile mais n'est mentionné nulle part sur les étapes pour exécuter le script dans Xcode. Pour exécuter ce script, rendez-vous sur TARGETS -> sélectionnez Build Phases puis l'en-tête supérieur dans Xcode, appuyez sur Editor -> Add build phases -> Add run script Build phases et vous obtiendrez une colonne dans la section Build Phase de TARGET. Ici, vous pouvez copier coller le script ci-dessus et le télécharger avec succès sur Appstore.
shashi Gupta
5
Ne fonctionne pas dans Xcode 11.2 - quelqu'un a trouvé une solution?
JMIT
180

La réponse donnée par pAkY88 fonctionne, mais j'ai rencontré le même problème que Mario A Guzman dans https://stackoverflow.com/a/35240555/5272316 : une fois que nous avons coupé les architectures inutilisées, nous ne pouvons plus exécuter le script car il essaie de supprimer pas de tranches existantes, car xcode ne réintègre pas le binaire à chaque fois. L'idée était - il suffit de supprimer les tranches i386 et x86_64 lors de la construction pour l'archivage, j'ai donc modifié le script:

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

Ce script supprime simplement les tranches i386 et x86_64 du gros binaire (si elles existent) s'il ne fonctionne pas pour le simulateur (cela signifie que le dossier de destination n'est pas comme "Debug-iphonesimulator").

Désolé, je ne connais pas les scripts shell, donc peut-être que quelqu'un pourrait l'écrire de manière plus élégante. Mais ça marche)

Varrry
la source
1
Merci pour l'idée. J'ai simplement ajouté une vérification au code de la réponse acceptée à l'intérieur de la boucle while case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacet cela a fonctionné comme un charme.
Michael Radionov
TARGET -> Build Phases -> [CP] Embedded Pods FrameworksJ'ajoute ce script mais cela ne fonctionne pas et j'ai encore des erreurs de téléchargement sur iTunesConnect. Comment exécuter ce script?
PiterPan
2
PiterPan, ajoutez-le en tant que phase RunScript distincte
Varrry
1
Je viens de cocher l'option "Exécuter le script uniquement lors de l'installation" et elle est ignorée sauf lors de l'archivage.
Rivera
Tout ce qui a été suggéré ici a-t-il réussi à effacer l'erreur de Carthage; mais il fallait le télécharger sur l'App Store sans validation pour obtenir des informations utiles sur les raisons de l'échec. Géré pour résoudre ce problème et aller de l'avant ...
user3069232
90

Si vous utilisez Carthage, vous pouvez rencontrer ce problème car le projet est:

  • Manque la carthage copy-frameworksphase de construction.
  • Ou la phase de construction n'inclut pas tous les frameworks (liste incomplète).

Cette action filtre les frameworks en une liste d'architectures valides (code) .

Configuration de la phase de construction des frameworks de copie

Depuis le bâtiment Carthage pour les étapes iOS :

Dans l'onglet des paramètres «Build Phases» de vos cibles d'application, cliquez sur l'icône «+» et choisissez «New Run Script Phase». Créez un script d'exécution dans lequel vous spécifiez votre shell (ex: bin / sh), ajoutez le contenu suivant à la zone de script sous le shell:

/usr/local/bin/carthage copy-frameworks

et ajoutez les chemins d'accès aux cadres que vous souhaitez utiliser sous «Fichiers d'entrée», par exemple:

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

Ce script contourne un bogue de soumission sur l'App Store déclenché par des binaires universels et garantit que les fichiers liés au code bit et les dSYM nécessaires sont copiés lors de l'archivage.

odlp
la source
Comme note supplémentaire, j'ai récemment rencontré ce problème après être passé de l'utilisation d'une ancienne version précompilée d'un cadre tiers à une nouvelle version du même cadre installé à l'aide de Carthage. Même une fois Carthage entièrement installé, j'ai continué à recevoir cette erreur. Pour moi, le correctif consistait à supprimer complètement le framework du projet et à le rajouter. Si vous utilisez Carthage et que cette réponse ne le résout pas pour vous, essayez de le faire.
Ash
1
En effet, un excellent article. Notez que souvent, votre meilleur pari est simplement de supprimer tous les cadres et de recommencer à ajouter tous vos cadres de Carthage. Acclamations
Fattie
J'utilise Carthage et Marshal et j'ajoute $(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkle travail
Ricardo Mutti
dans iOS moderne, 99% du temps c'est le problème - vous avez juste oublié les frameworks de copie. (100% des projets utilisent désormais Carthage.)
Fattie
41

J'ai résolu l'erreur ITMS-90080 en supprimant un cadre (l'excellent SVProgressHUD) de la section Embedded Binaries (cible Xcode -> onglet Général).

entrez la description de l'image ici

Bart van Kuik
la source
5
Cette réponse devrait avoir beaucoup plus de votes positifs. Je soupçonne que c'est la cause première de nombreuses personnes utilisant Carthage.
mm2001
15
Si vous essayez d'incorporer un cadre dynamique, le supprimer entraîne pour moi le message d'erreur suivant: "Raison: image introuvable"
electronix384128
1
Cela a fonctionné pour moi. Vous devez supprimer le cadre des fichiers binaires intégrés et l'ajouter simplement aux cadres et bibliothèques liés. De plus, vous devez faire les autres choses comme exécuter le script que vous trouvez dans les autres réponses.
smileBot
33

Si vous utilisez CarthageAssurez - vous que votre Embed Frameworks Build Stepest avant laCarthage copy-frameworks


Dans certains cas inhabituels (exemple: framework Lottie-iOS):

  • vous l'aurez simplement dans "Link Library" comme d'habitude.

  • Cependant, vous devez également l'ajouter explicitement dans "Embed Frameworks" (même si cela semble inutile, car cela fonctionne parfaitement lorsque vous ne l'avez que dans "Embed Frameworks"),

  • et le mettre dans des cadres de copie

  • et assurez-vous que les cadres de copie se trouvent après "Intégrer les cadres"

Maciej Swic
la source
De cette façon, mon problème. Je vous remercie.
DookieMan
15

Supprimez [x86_64, i386] du cadre en utilisant l'étape ci-dessous. [x86_64, i386] est utilisé pour le simulateur.

  1. Ouvert Terminal

  2. ouvrez le chemin de glisser de votre projet de framework respectif vers Terminal

    exemple : cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. définissez votre nom Framework dans la commande ci-dessous et exécutez

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

  1. Maintenant, ouvrez à nouveau votre projet, nettoyer, construire et exécuter et créer des archives ...
MAhipal Singh
la source
@mahipal Singh .. après avoir supprimé à l'aide de la commande lipo. l'application ne fonctionne pas dans le simulateur. a obtenu une erreur comme x84_64 manquant pour le simulateur d'iphone. mais fonctionne bien dans un appareil réel.
Hitarth
C'est parce que le simulateur ne prend en charge que le cadre de débogage
MAhipal Singh
14

Je vais ajouter mes 2 cents ici (de manière moins effrayante :-). J'ai rencontré un certain nombre de bibliothèques grasses de fournisseurs qui (pour une raison quelconque) ne fonctionnent pas de la manière habituelle en les ajoutant au Frameworksrépertoire tel que documenté par Apple. La seule façon dont nous avons pu les faire fonctionner est en tirant vers la .framekworkdroite dans le répertoire du projet et en liant le Embedded Frameworkset Link Binary with Librariesmanuellement dans les paramètres de construction. Cela semble avoir fonctionné sans aucun problème, cependant, comme avec n'importe quelle bibliothèque de graisse, ils sont livrés avec les architectures de simulateur étrangères i386 et x86_64avec les armarchitectures.

Un moyen rapide de vérifier les architectures de la bibliothèque de graisses est

$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`

Qui devrait cracher une sortie quelque chose comme ça

Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64

Cela confirme que vous aurez besoin de "couper la graisse" (à savoir i386& x86_64) de votre cadre avant le téléchargement iTunesConnect Archival, ce qui ne permet pas ces architectures (car elles ne sont pas prises en charge pour iOS).

Maintenant, toutes les réponses (ou au moins certaines des réponses) ici fournissent ces merveilleux scripts d'exécution qui, j'en suis sûr, fonctionnent très bien, mais seulement si votre Framework réside dans le Frameworksrépertoire. Maintenant, à moins que vous ne soyez un drogué de script shell, ces scripts sans modifications ne fonctionneront pas pour le scénario que j'explique ci-dessus. Cependant, il existe un moyen très simple de se débarrasser des architectures i386& x86_64du framework.

  1. Ouvrez le terminal dans le répertoire de votre projet.

  2. Changez le répertoire directement dans le .framekwork, comme

    cd YourProjectDir/YourProject/YourLibrary.framework

  3. Exécutez la série de commandes comme indiqué ci-dessous -

$ 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

Quelques points à noter ici - lipo -removedoivent être effectués une fois pour chaque architecture à supprimer. lipone modifie pas le fichier d'entrée, il ne produit qu'un fichier, vous devez donc exécuter lipo -removeune fois pour x86_64et i386. Les commandes ci-dessus le font simplement en renommant d'abord l'exécutable, puis en supprimant éventuellement les arches souhaitées, puis en nettoyant les fichiers restants. Et c'est tout, vous devriez maintenant voir une coche verte dans le téléchargement d'archivage Application Loader vers iTunesConnect.

Choses à garder à l'esprit : Les étapes ci-dessus ne doivent être effectuées que pendant la construction de la production, car .frameworkelles seront supprimées des architectures du simulateur, les constructions sur les simulateurs cesseront de fonctionner (ce qui est prévu). Dans un environnement de développement, il ne devrait pas être nécessaire de supprimer les architectures du .frameworkfichier, car vous voulez pouvoir tester à la fois sur le simulateur et sur un périphérique physique. Si votre bibliothèque de matières grasses réside dans le Frameworksdossier du projet, veuillez consulter la réponse acceptée.

AnBisw
la source
Solution simple pour ceux qui n'ont pas envie de script.
exécutez simplement la commande ci-dessus, la taille de l'arche réduite de moitié. espérons faire une différence.
showmyroutes
Même si j'ai déployé le script pour que tout fonctionne normalement, cela doit être une description appropriée de la façon de résoudre le problème.
Sharkes Monken
aime la nature de cette réponse. propre et concis
Hudi Ilfeld
10

J'ai eu le même problème même après avoir ajouté le script et mis à jour le framework plusieurs fois.

Assurez-vous que dans xCode le script est ajouté à la fin, après l'incorporation. Je pense que j'ai accidentellement déplacé le script avant le cadre intégré.

entrez la description de l'image ici

Remarque: j'ai xCode 9.1

Florin Dobre
la source
Cela a fonctionné pour moi. Où le script de juste @ pAkY88 était suffisant la dernière fois que j'ai fait une sortie il y a près d'un an.
RedHotPawn.com
J'ai eu le même problème et cela a fonctionné pour moi. Assurez-vous de vérifier la position du script d'exécution chaque fois qu'un framework est supprimé et ajouté (uniquement nécessaire lorsqu'il n'y a qu'un seul framework qui a été supprimé).
Baran Emre
Vous sauvez ma journée. Juste pour ajouter un script après le framework intégré.
Mayuri R Talaviya
8

Mis à jour pour Xcode 10.1, la solution ci-dessous a fonctionné pour moi:

Il vous suffit de supprimer le cadre des fichiers binaires intégrés et de simplement l'ajouter aux cadres et bibliothèques liés.

Référez-vous à la capture d'écran ci-dessous;

entrez la description de l'image ici

Kiran jadhav
la source
1
Solution de travail pour moi (y)
Alok
il supprime le même des cadres et bibliothèques liés
Ranu Dhurandhar
8

Merci à toutes les réponses ci-dessus. Voici un script fonctionnant avec swift 4.2 et 5 . Remplacez la chaîne Your_Framework_Name par le nom d'origine de votre Framework.

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
Gurjinder Singh
la source
Je vous remercie! Cela a fonctionné pour moi, mais pas la réponse acceptée.
besserwisser
5

Ce problème a été résolu pour moi en modifiant légèrement le script d'exécution à partir de la réponse de pAky88 et en l'exécutant après l'intégration des frameworks. Veillez également à décocher la case "Exécuter le script uniquement lors de l'installation".

/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
objectivement C
la source
4

J'ai supprimé les architectures i386 et x64_86 des paramètres de construction - Architectures valides - Version, et tout a bien fonctionné.

entrez la description de l'image ici

Maintenant, le seul problème serait que vous ne pouvez pas exécuter une version RELEASE à des fins de test sur un SIMULATEUR . Mais aussi facilement que vous avez supprimé les arches, vous pouvez les rajouter si vous le souhaitez.

Mihai Erős
la source
1
OUI, c'est la solution.
Ofir Malachi
3

la solution simple qui a fonctionné pour moi était

1- supprimer le framework des frameworks embarqués.

2- ajouter le cadre en tant que cadre lié

terminé!

DeyaEldeen
la source
1

Cette erreur (ITMS-90240) peut également être provoquée par une bibliothèque statique (.a). voici un script pour dépouiller les architectures en excès. Dans Xcode, ajoutez ceci à Target> BuildPhases> Cliquez sur le + et sélectionnez Run Script. Collez-le ensuite dans la boîte de script.

Le script recherche les fichiers .a, vérifie s'il contient une architecture incriminée, puis s'il crée un nouveau fichier .a sans cette architecture.

Pour 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

Pour 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
la source
1

J'avais le même problème. Même cela ne fonctionnait pas après l'ajout du script d'exécution donné. C'était un problème lié à Xcode. J'utilisais la version 9.0 de Xcode mais la dernière version était 9.2.

J'ai donc installé le dernier Xcode (9.2) et cela a fonctionné.

Mahesh
la source
0

Votre framework contient à la fois ARMet du x86code, ce qui vous permet de l'utiliser sur un appareil ou dans le simulateur. Si vous avez l'intention de soumettre votre application à l'App Store, exécutez le script suivant pour supprimer le code inactif du binaire.

1.Sélectionnez votre cible dans le Navigateur du projet et cliquez sur Générer des phases en haut de l'éditeur de projet.

2.Dans le menu Éditeur, sélectionnez Ajouter une phase de construction, puis Ajouter une phase de génération de script d'exécution (ou cliquez sur le bouton + dans le coin supérieur gauche de l'éditeur de phases de construction).

3.Agrandir le triangle de divulgation à côté de la nouvelle phase de génération de script d'exécution qui vient d'être ajoutée. Dans la zone de l'éditeur de script, collez ce qui suit: bash

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

Georgekutty Joy
la source
Cela suppose que le script strip-frameworks.sh se trouve être là ...
Codezy
0

Voici un script que j'ai utilisé pour supprimer spécifiquement l'architecture d'un seul framework du fichier exécutable.

# 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"

Ajoutez ce script à vos projets "Build Phases" de votre projet cible. Assurez-vous de cocher la case: "Exécuter le script uniquement lors de l'installation"

Aperçu de l'emplacement où insérer un exemple de script

keaplogik
la source