Impossible de générer une archive d'application iOS dans xcode


175

J'ai un problème pour générer une archive d'application iOS à partir d'une application. L'application se compile très bien et fonctionne même dans le simulateur. Maintenant, je voulais faire des tests ad hoc et je ne peux pas générer l'archive d'application iOS. Lorsque je clique sur le produit -> Archive, cela génère une archive xcode générique. Quelqu'un peut-il m'aider. Je dois mentionner que j'ai déjà généré une archive d'application iOS de cette application. Il vient de s'arrêter pour générer une archive iOS pour une raison quelconque. Merci beaucoup.


7
Même si la question concerne la génération d'archives à partir de xcode, j'ai rencontré ce problème en utilisant xcodebuild. La solution est de spécifier la destination:xcodebuild -destination generic/platform=iOS
db42

Merci @ db42, ça l'a fait!
fabb

1
pouvez-vous élaborer sur la résolution - où apportez-vous le changement?
jlo-gmail

Si vous avez des fichiers .xcodeproj dans Projet> Cibles> Phases de construction> dépendances cibles, supprimez-le de là, puis créez votre ipa. Ça marche pour moi. Cheers
Kalpesh Panchasara

Réponses:


316

Vérifiez les paramètres de construction:

  1. Ignorer l'installation est NON pour la cible principale du projet
  2. Ignorer l'installation est OUI pour les cibles du cadre (sous-projets)
  3. Dans les phases de construction pour les sous-projets, les en-têtes de copie doivent être dans Project et non dans Public (ne s'applique pas si vous créez une bibliothèque statique)
  4. Le répertoire d'installation sous Déploiement est valide (/ Applications par exemple)

2
C'est la réponse la plus complète qui incorpore les réponses partielles ci-dessus. Merci Alex L! Je pense que cela devrait être la réponse choisie pour cette question.
Brandon

3
En tant que méta question, comment avez-vous compris cela? Il semble que je compte sur Stackoverflow pour toutes mes questions liées à la construction.
philipkd

4
Belle! Je pensais que c'était un problème avec les profils d'approvisionnement, mais cela fonctionnait très bien. Le sous-projet était la branche mapbox de route-me / MapView. la copie des en-têtes était la clé comme l'indique l'article ci-dessous, elle peut être trouvée dans les phases de construction du sous-projet.
rcarver

7
# 3 a résolu mon problème, mais j'avais également besoin de déplacer des fichiers de Private vers Project avant que mon archive ne soit créée en tant qu'archive d'application iOS.
Thomas Hajcak

4
Techniquement, le problème n'est pas que les en-têtes sont publics sous Copier les en-têtes, c'est que Paramètres de construction> Chemin du dossier des en-têtes publics est défini sur la valeur par défaut /usr/local/include. Si vous construisez une bibliothèque statique, les en-têtes doivent être publics, il est donc plus correct si # 3 est de changer le chemin du dossier des en-têtes publics en quelque chose de plus sensé comme include/$(TARGET_NAME). @CopperCash le note dans une réponse ci-dessous.
bcattle

75

Cela peut se produire si vous avez ajouté un framework / bibliothèque ... vous devez modifier les paramètres Target-> Build de cette bibliothèque et définir le paramètre «Ignorer l'installation» sur «Oui». Lorsque vous réarchivez, XCode devrait recommencer à produire une «archive d'application iOS» plutôt qu'une «archive xcode générique».


mais "Skip Install" n'est pas disponible dans xcode 4.4.1, au moins je suis incapable de trouver skip intall dans mon xcode
Mashhadi

2
La même chose s'applique aux lots ajoutés.
Mark Horgan

62

En plus de Ignorer l'installation sur Oui et au cas où vous ouvririez un autre projet lib / framwork dans votre projet d'application, vous devez déplacer les en-têtes (le cas échéant) de public vers le projet dans la phase de construction / les en- têtes de copie .

phase de construction de votre cible lib / framwork


3
J'étais sur le point de perdre espoir, car Skip Install to Yes ne fonctionnait pas pour moi. La copie des en-têtes dans Project a fait l'affaire pour moi. Merci!
ksm

10
Pour vous aider à localiser le sous-projet Xcode défectueux, vous pouvez afficher l'archive Xcode générique dans le Finder et explorer le package. À l'intérieur de .xcarchive, vous verrez les en-têtes défectueux dans Products / usr / local / include.
MonsieurDart

1
Pourquoi mettre quelques fichiers pour copier des en-têtes en public pourrait-il bousiller cela?
mskw

mskw, je suppose que si l'artefact construit contient un ou plusieurs en-têtes publics, il ne peut pas devenir une archive «déployable par l'appareil» (iOS App Archive à partir de laquelle vous générez un IPA). Il reste une archive de projet Xcode. Merci
ebtokyo

1
putain, merci, ça a marché pour moi .. Je me demande comment diable vous parvenez à trouver ce genre de solutions :)
Fabio Napodano

45

J'ai fait ce qui suit pour que cela fonctionne pour moi:

  1. J'avais une bibliothèque statique three20, j'ai utilisé des cocoapodes pour inclure les fichiers dans le projet principal
  2. suivi le saut d'installation pour tous les autres sous-projets / bibliothèques statiques et basculé les en-têtes de copie de public à projet comme indiqué ci-dessus
  3. le plus important: dans chaque bibliothèque que votre projet utilise, allez aux phases de construction -> Copiez les fichiers et assurez-vous que la destination est modifiée de Absolute pathà products directory. Remarque: consultez l'indice ci-dessous pour affiner votre recherche afin de trouver la bibliothèque à l'origine de cette erreur.

et c'était tout!

astuce: pour avoir une idée des fichiers incriminés qui amènent votre archive à créer un fichier d'archive plutôt qu'un ipa, procédez comme suit:

  1. Sélectionnez l'archive et cliquez sur le bouton Distribuer.
  2. Sélectionnez l'option «Enregistrer les produits construits».
  3. Appuyez sur Suivant et enregistrez.
  4. Parcourez le répertoire créé dans le Finder.
  5. Le sous-répertoire «bibliothèques» identifiera les bibliothèques dont vous avez besoin pour définir Ignorer l'installation sur Oui.
  6. dans certains cas usr/local/include, identifiera les fichiers d'en-tête coupables que vous devez déplacer de Public vers Project ou les fichiers que vous devez modifier du chemin absolu vers le répertoire des produits (ou même les fichiers que vous avez oubliés de définir l'option Ignorer l'installation sur oui). mais ce répertoire (c'est-à-dire usr / local / include) varie en fonction de la structure de votre sous-bibliothèque. Dans de nombreux cas .. vous verrez tous les fichiers répertoriés sous Copier les fichiers à l'étape 3 ci-dessus répertoriés ici. Si vous les trouvez ici, vous avez une réponse définitive à la cause de votre problème.

update to hint: pour rendre la vie encore plus simple .. quels que soient les fichiers qui apparaissent à l'étape 4 dans l' astuce ci-dessus .. recherchez-le simplement dans la recherche globale de xcode .. et vous devriez obtenir des résultats immédiats pour ce que vous voulez .. par exemple, c'était le contenu de mon dossier (en suivant les étapes de l'indice ci-dessus):

entrez la description de l'image ici

Je pourrais donc dire que cela a quelque chose à voir avec les bibliothèques crypto et ssl ... les chercher:

entrez la description de l'image ici

m'a fait réaliser que j'avais oublié de définir skip install sur yes.


Bon indice! J'avais changé certains en-têtes de framework en "Private"; pour une raison quelconque, cela les avait copiés ./usr/local/include.
Ben Mosher

1
c'est toujours un plaisir de pouvoir aider @BenMosher :)
abbood

1
La meilleure réponse que j'ai eue. Merci pour la pointe, a sauvé ma journée. !
neywen

Certainement la réponse que je cherchais - économiser des produits de construction m'a indiqué la cause exacte du problème.
Dennis L

Cette réponse complète avec "Save Built Products" est si utile - @abbood, un immense merci à vous. J'espère pouvoir rendre la pareille un jour.
Scott Corscadden

21

Si vous exportez l'archive, ouvrez-la et voyez /urs/local/includedans Produits, essayez cette suggestion :

Dans chaque module, sous Packaging, Private Headers Folder Pathet Public Headers Folder Pathest réglé /usr/local/include. Si je les efface, j'obtiens une archive valide.

entrez la description de l'image ici

J'ai travaillé pour moi après la mise à niveau de mon application React Native vers 0.11.0Xcode 7et CocoaPods 0.39.0.beta.4.


1
Je peux confirmer que cela fonctionne! Tant que vous vous souvenez d'effacer les chemins d'en-tête privés et publics. C'est aussi assez facile, si vous sélectionnez simplement tous les pods, recherchez le chemin d'en-tête, puis effacez-les tous en même temps.
Dids le

1
Je peux également confirmer que cela fonctionne, m'a fait gagner beaucoup de temps, cela s'est produit lorsque j'ai mis à niveau mes pods vers la version 0.39.0.beta
Bryan P

Impressionnant. A travaillé pour moi :) Je luttais depuis 1 jour et demi. Merci, merci, merci :) :) :)
Srikanth

Je pense que c'est celui qui a fonctionné pour moi Xcode 7.0 iOS9. Je n'ai pas de cocoapodes, mais cela a néanmoins résolu le problème. Thanks man
Geoff H

En plus de cela, j'ai dû définir SKIP_INSTALL sur Oui sur mon extension et mon application WatchKit pour que cela fonctionne.
Snowman

12

Si vous utilisez CocoaPods ainsi que WatchKit ou une extension Today, il y a un problème ouvert sur le repo CocoaPods expliquant quel pourrait être votre problème.

La solution pour moi était de supprimer la Copy Pod Resourcesphase des cibles WatchKit Extension et Today Extension sousBuild Phases . Le projet a été compilé et archivé comme prévu une fois que j'ai fait cela.

J'espère que cela aide quelqu'un, cela m'a laissé perplexe pendant une journée entière!


1
@ Lewis42 pourrait toujours ajouter une prime;)
rebello95

Ne voyez pas une option pour, un vote pour votre commentaire devra faire;)
lewis

@ Lewis42 vous devrez ajouter la prime à la question et l'attribuer à une réponse lol
rebello95

@ rebello95, tu fais du rock!
Matt

10

Si l'une des réponses ci-dessus ne fonctionne pas, votre problème vient probablement de cocoaPods. La dernière mise à jour a 0.38.1gâché les choses pour moi, mais j'ai ensuite rétrogradé 0.37.1et les choses sont revenues à la normale. En utilisantXcode 6.3.1

Modification ultérieure: la mise à jour vers 0.38.2corrigera également ce problème. Plus d'informations sur la cause de ce problème ici: Cocoapods 0.38.1 n'a pas réussi à créer une archive valide


3
J'ai mis à jour 0.38.2et j'ai toujours des problèmes. Êtes-vous sur Xcode 7?
Porter Hoskins

@PorterHoskins Je viens d'écrire ce problème car Xcode 7 ne construira PAS une archive valide à partir du même projet qui construit une archive valide dans Xcode 6 . J'utilise Cocoa Pods 0.38.2, lorsque j'utilise Xcode 6 tout va bien, mais avec Xcode 7 l'archive n'est pas créée correctement. Avez-vous vérifié la structure de vos dossiers pour voir si vous avez un fichier .appex en dehors de votre .app dans le package?
Ours polaire

J'ai un cadre à /Library/Frameworks. Je pense que cela peut avoir quelque chose à voir avec le fait que les cabosses de cacao de Google ne sont pas construites en tant que cadre dynamique. Cela ressemble à github.com/CocoaPods/CocoaPods/issues/3889
Porter Hoskins

3
J'ai déplacé pour chaque en-tête de pod dans Build Phases / Headers vers la section projet de public et cela a fonctionné. Donc, en effet, le problème pourrait être dans CocoaPods.
Denis Kutlubaev

7

Bien que j'utilise Xcode5 et que ce qui l'a trié pour moi, c'était la modification du schéma de construction - essayer toutes les suggestions ci-dessus qui étaient applicables n'a pas aidé dans mon cas.

J'avais deux cibles, disons, "App" et "App GRATUIT". Mes problèmes avec l'archive générique sont survenus lorsque j'essayais d'archiver la version GRATUITE, que j'ai ajoutée après la version «normale» de l'application. Dans mon cas, lorsque j'ai sélectionné son schéma dans la barre d'outils et choisi Edit Scheme ... j'ai vu que la section Build avait deux cibles, à savoir App et App FREE.

J'ai décoché toutes les colonnes pour App, ne laissant que les colonnes App FREE cochées, et j'ai cliqué sur OK. La prochaine fois que j'ai choisi Produit> Archive, j'ai obtenu mon application GRATUITE au lieu d'une archive générique. :)


7

Si vous n'avez qu'un seul projet, cette solution serait peut-être utile. Ce problème était survenu lorsque j'ai dupliqué la cible. En conséquence, j'ai fait construire deux cibles en parallèle. Cela causait le problème. L'archive IOS générique a été créée.

Pour désactiver le parallèle construit, allez à

  • Gérer les projets,
  • Modifier le schéma,
  • Construire,
  • Retirez l'autre cible.

5

J'ai eu ce problème après la mise à jour vers iOS 9 et Xcode 7. La solution de Josh H a fonctionné pour moi:

Dans chaque pod, sous Empaquetage, le chemin du dossier des en-têtes privés et le chemin du dossier des en-têtes publics sont définis sur / usr / local / include. Si je les efface, j'obtiens une archive valide.

J'ai également créé un script de post-installation pour mon Podfile pour le faire automatiquement!

    post_install do |installer_representation|
        installer_representation.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
                config.build_settings['PUBLIC_HEADERS_FOLDER_PATH'] = [""];
                config.build_settings['PRIVATE_HEADERS_FOLDER_PATH'] = [""];
            end
        end
    end

Ajoutez-le simplement au bas de votre Podfile et exécutez pod install


5

J'ai plusieurs projets dans mon espace de travail (GTL, Pods et mon projet principal) et c'est ce qui a fonctionné pour moi:

Sélectionnez le projet, il y aura 2 types là-bas, il y a le projet et il y a les cibles .

Pour les projets qui ne sont pas vos principaux goûts GTLou PODS:

Projets:

Skip Install = NO
Installation Directory = /Applications
// For pods
Private Headers Folder Path = ""
Public Headers Folder Path = ""

Objectifs:

Skip Install = YES
Installation Directory = /Applications
// For pods
Private Headers Folder Path = ""
Public Headers Folder Path = ""

Pour le projet principal (qui porte généralement le même nom que le nom de votre produit):

Projets:

Skip Install = NO
Installation Directory = /Applications

Objectifs:

Skip Install = NO
Installation Directory = /Applications

Vérifiez la cible de déploiement ios sur chaque projet et cible pour vous assurer qu'ils sont tous identiques.


Merci de l'avoir expliqué étape par étape. cela m'a vraiment aidé à résoudre mon problème.
Arslan

4

J'ai eu ce problème. Dans mon cas, cela a été causé par le maintien d'une cible d'application Mac en tant que dépendance de l'application iOS.

La raison pour laquelle il a été configuré de cette manière était que l'application Mac était un outil utilisé pour générer des données pour l'application iOS, qui était ensuite incluse dans le bundle.

J'ai dû supprimer cette dépendance et créer l'outil séparément avant de créer une version de l'application iOS elle-même.


Les bibliothèques telles que lippd sont livrées avec des cibles ios et osx, j'ai oublié de supprimer la cible osx ... doh
james_alvarez

4

Dans mon scénario, j'obtenais l'erreur "Generic Archive" seulement après avoir commencé à inclure du code Swift dans mon projet à prédominance Objective-C. Après beaucoup de dépannage et d'examen du fichier d'archive que Xcode crachait, j'ai remarqué que leSwiftSupport dossier (avec les dylibs requis pour l'exécution Swift) se trouvait à un endroit différent dans mes archives que dans une toute nouvelle archive d'application de projet Swift à la vanille. .

J'ai trouvé le Installation Directoryparamètre de construction et j'ai remarqué qu'il était défini sur un chemin personnalisé dans mon projet. Je l'ai simplement supprimé (en le définissant sur sa valeur générique de/Applications ) et le prochain Build -> Archive que j'ai fait a fonctionné comme prévu et m'a donné une archive d'application iOS appropriée.

TL; DR: assurez-vous que votre Installation Directoryparamètre de construction est défini sur sa valeur par défaut /Applicationslors de l'inclusion du code Swift dans votre application, en particulier si vous commencez avec un fichier de projet plus ancien qui peut avoir des paramètres de construction hérités inattendus.


3

Laisser cela ici pour sauver les autres du même voyage.

J'ai trouvé que je devais également supprimer la même phase de création de Copy Pod Resources d'une cible de bibliothèque statique dans mon espace de travail.


après avoir essayé beaucoup de choses ci-dessus, cela a fonctionné pour moi (Xcode 7)
humphriesj

2

Ajout à la réponse d'Alex L.

Point 3. Changez "Build Settings" -> "Public Header Folder Path" en "include / xxx" fonctionne également.


C'est plus correct que le n ° 3 ci-dessus. Vos en-têtes doivent être publics si vous
créez

2

Si rien de ce qui précède ne vous a aidé ... après beaucoup de temps .......

J'ai supprimé la valeur dans le fichier Info.plist pour la version Bundle parce que j'étais assez content avec juste Bundle Version Short 1.0.Mauvais. Ne fais pas ça.

* Notez que j'ai fait cela en l'éditant dans l'interface utilisateur sur la droite sans réaliser que cela mettrait une clé vide dans le fichier Info.plist. Je pense que cela le rend invalide. Mon bundle est apparu comme d'autres éléments lors de l'archivage et n'avait pas d'icône, et je ne pouvais pas télécharger n'importe où.

Cela se résume à des valeurs invalides dans Info.plist. Si ce n'est pas une archive valide, essayez de décompresser une ancienne archive et de déposer / écraser votre archive actuelle et voyez si elle le corrige lors de la reconstruction de l'archive.


1
  1. Accédez aux paramètres de construction et ajoutez

    yourAppName / Resources / dist.plist aux droits de signature de code

  2. Appuyez sur cmd + B avec un appareil iOS ou un appareil réel sélectionné comme cible de construction

  3. Une fois terminé -> faites défiler jusqu'au dossier "Produits" et faites un clic droit sur votreAppName.app

  4. Choisissez "Afficher dans le Finder"

  5. Créez un dossier avec Nom Payload ( majuscule "P" )

  6. Copiez yourAppName dans votre dossier Payload

  7. Créez un zip à partir de votre dossier Payload

  8. Renommez le zip en yourAppName.ipa

TERMINÉ


1

Après avoir essayé à peu près tout:

  • Nettoyer, archiver
  • supprimer DerivedData, Archive
  • redémarrer Xcode (j'utilisais XCode7), archiver
  • combinaisons de ci-dessus ...

J'ai alors remarqué que ma partition de démarrage était `` faible sur l'espace disque libre '' ... environ 1 Go environ. J'ai redémarré, puis j'ai obtenu environ 18 Go de libre.

Ensuite, j'ai ouvert Xcode et le projet, exécuté Archive ... et étonnamment (après une heure à essayer de créer une archive), j'ai finalement obtenu une archive non générique.

Aucune idée si c'est un problème de disque libre qui l'a résolu ou un redémarrage du macOS qui l'a corrigé, mais cela a fonctionné pour moi.



0

Dans mon cas, j'ai dû déplacer FMDB et BlocksKit vers des bibliothèques statiques. Auparavant, ils étaient construits en tant que sous-projets. N'oubliez pas que vous pouvez utiliser lipo pour créer des bibliothèques universelles. Lors de la construction des produits finaux, le code du simulateur sera supprimé automatiquement.


0

Une autre raison possible est d'avoir des références dans «Dépendances cibles» à des projets pour une plate-forme différente. Dans mon cas particulier, je travaillais sur un projet qui partage du code pour OSX et iOS. Dans l'une des cibles iOS, j'avais accidentellement ajouté une cible OSX en tant que dépendance.


0

Afin d'être minutieux, je publie ma solution.

J'ai rencontré exactement le même problème en essayant de créer une archive d'un projet iOS dans Xcode 5.1.1 (5B1008). Aucune des suggestions ci-dessus n'a résolu le problème, et la plupart d'entre elles n'étaient pas pertinentes (je n'avais ajouté aucun cadre et je n'avais aucune entrée publique dans la section Copier les en-têtes de mes phases de construction).

Dans mon cas, résoudre le problème consistait simplement à fermer mon projet, à supprimer toutes les archives que j'avais précédemment créées, à aller dans Préférences> Comptes, à supprimer mon compte développeur, à quitter Xcode, à relancer, à rajouter mon compte développeur, à démarrer le processus d'archivage encore. Cela a résolu mon problème immédiatement.


0

Encore une solution, car tout ce qui précède n'a pas fonctionné pour moi ...

Changé le User Header Search Paths(je supposeHeader Search Paths cela fonctionnerait tout aussi élégamment) en "$(BUILT_PRODUCTS_DIR)/BlocksKit".

Contexte :

Dans BlockKit, les développeurs ont structuré les en-têtes du projet principal différemment de la structure lors du déploiement. Ainsi, vous ne pouvez pas référencer les en-têtes dans le projet et devez référencer les en-têtes copiés dans le répertoire de construction.


0

La façon dont cela fonctionnait pour moi dans (Xcode 5) j'avais 2 cibles et quand j'ai édité le schéma, dans le volet gauche de l'éditeur de schéma, vous verrez le [BUILD, RUN, TEST, PROFILE XXX.APP, ANALYZE, ARCHIVE ] dans le volet BUILD, vous verrez les cibles de votre projet répertoriées dans une liste. À l'extrême droite, vous verrez les sélections ARCHIVE, assurez-vous qu'une seule cible est sélectionnée pour l'archivage.

J'avais sélectionné 2 de mes cibles dans mon projet, je n'ai coché que la cible que je voulais dans le produit, et cela a fonctionné!


0

J'ai résolu cette erreur en ouvrant uniquement le projet d'application dans XCode, c'est-à-dire. ne pas ouvrir un espace de travail comprenant l'application et d'autres projets / bibliothèques / frameworks.

Ayant 2 projets séparés, un framework ou une bibliothèque partagée et une application iOS, j'ai dû ouvrir 2 fenêtres XCode différentes, chacune en ouvrant directement le fichier .xcodeproj au lieu du .xcworkspace commun , afin de construire préalablement chacune.

En tant qu'effet secondaire intéressant, XCode ne reconstruit plus chaque cible de chaque projet après avoir effectué un nettoyage , ce qui réduit les temps de construction.

Contexte: je crée un SDK open source et une application iOS de démonstration. J'avais tous les deux ouvert dans un seul espace de travail. Définir Ignorer l'installation sur OUI sur les cibles du SDK empêcherait quiconque de créer une archive, car elle serait vide, ce n'était donc pas une option. L'utilisation de Project au lieu d' en- têtes publics conduirait à une archive manquant des fichiers d'en-tête qui devraient être distribués, ce n'était donc pas non plus une option.


0

Car c'était parce que je travaillais dans un espace de travail. Le projet a bien été archivé mais ne serait pas affiché dans la fenêtre de l'organiseur. J'ai fermé l'espace de travail et ouvert le projet tout seul. L'archive a été ouverte dans l'organisateur ... j'espère que cela vous aidera.


0

Dans mon cas, j'avais un script personnalisé qui copiait des fichiers temporaires dans:

${TARGET_BUILD_DIR}/myTempDir

Cela signifiait qu'après avoir étudié l'archive pour inspecter son contenu, j'ai trouvé juste à côté du fichier .app un dossier myTempDir. Une fois que j'ai modifié le script pour enregistrer ailleurs, les choses ont été triées.


0

Essayez de définir les en-têtes $ (PROJECT_NAME) dans le chemin du dossier des en-têtes publics du projet Framework. Vous devez accéder aux paramètres de construction de la cible de la bibliothèque, puis modifier le chemin du dossier des en-têtes publics en tant qu'en-têtes $ (PROJECT_NAME).


0

Si vous utilisez Xcode 7 avec des cocoapodes v.0.38.2 . Essayez de supprimer copy pod resourcesde votre cible d'extension d'aujourd'hui.

entrez la description de l'image ici


0

J'ai rencontré ce problème après avoir ajouté un outil de ligne de commande OS X au projet de mon application iOS, et Ignorer l'installation a été défini sur NON par défaut pour la cible de l'outil de ligne de commande. Étant donné que vous ne pouvez évidemment pas installer un binaire OS X sur un appareil iOS, l'archivage par défaut est une archive Xcode générique. La définition de Skip Install sur YES pour cette cible a résolu le problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.