Impossibile generare l'archivio dell'app iOS in xcode


175

Ho un problema con la generazione di un archivio dell'app iOS da un'applicazione. L'applicazione si compila bene e funziona anche nel simulatore. Ora volevo fare dei test ad hoc e non posso generare l'archivio app iOS. Quando faccio clic sul Prodotto -> Archivio genera un archivio xcode generico. Qualcuno può aiutarmi. Dovrei menzionare che ho già generato un archivio app iOS di questa applicazione. Si è appena fermato per generare l'archivio iOS per qualche motivo. Molte grazie.


7
Anche se la domanda riguarda la generazione di archivi da xcode, ho riscontrato questo problema utilizzando xcodebuild. La soluzione è specificare la destinazione:xcodebuild -destination generic/platform=iOS
db42

Grazie @ db42, è stato così!
fabb

1
puoi approfondire la risoluzione: dove apporti il ​​cambiamento?
jlo-gmail,

Se hai dei file .xcodeproj in Progetto> Target> Crea fasi> dipendenze di destinazione rimuovilo da lì e quindi crea il tuo ipa. Per me funziona. Saluti
Kalpesh Panchasara,

Risposte:


316

Controlla le impostazioni di costruzione:

  1. Ignorare l'installazione è NO per l'obiettivo principale del progetto
  2. Ignora l'installazione è SÌ per gli obiettivi del framework (sottoprogetti)
  3. In Build Phases per sottoprogetti, le intestazioni di copia devono essere in Progetto, non in Pubblico (non applicabile se si crea una libreria statica)
  4. La directory di installazione in Deployment è valida (/ Applicazioni ad esempio)

2
Questa è la risposta più completa che incorpora le risposte parziali sopra riportate. Grazie Alex L! Penso che questa dovrebbe essere la risposta scelta per questa domanda.
Brandon,

3
Come meta domanda, come l'hai capito? Sembra che io faccia affidamento su StackOverflow per tutte le mie domande relative alla build.
philipkd,

4
Bellissimo! Ho pensato che questo fosse un problema con i profili di provisioning, ma ha funzionato alla grande. Il sottoprogetto era il ramo mapbox di route-me / MapView. la copia delle intestazioni era la chiave come afferma il post qui sotto, che può essere trovata nelle fasi di costruzione del progetto secondario.
Rosario

7
# 3 risolto il mio problema, ma dovevo anche spostare i file da Privato a Progetto prima che il mio archivio fosse creato come un archivio app iOS.
Thomas Hajcak, il

4
Tecnicamente, il problema non è che le intestazioni sono Pubbliche in Intestazioni copia, è che Impostazioni di costruzione> Percorso cartella intestazioni pubbliche è impostato sul valore predefinito di /usr/local/include. Se stai costruendo una libreria statica, le intestazioni devono essere pubbliche, quindi è più corretto se # 3 deve cambiare il percorso della cartella delle intestazioni pubbliche in qualcosa di più sensato include/$(TARGET_NAME). @CopperCash lo nota in una risposta di seguito.
bcattle,

75

Questo può accadere se hai aggiunto un framework / libreria ... devi modificare Target-> Build Settings di quella libreria e impostare "Skip Install" su "Yes". Quando esegui nuovamente l'archiviazione, XCode dovrebbe iniziare a produrre nuovamente un "Archivio app iOS" anziché un "archivio xcode generico".


ma "Skip Install" non è disponibile in xcode 4.4.1, almeno non riesco a trovare salta intall nel mio xcode
Mashhadi

2
Lo stesso vale per i bundle aggiunti.
Mark Horgan,

62

Oltre a Salta installazione su e nel caso in cui sia stato aperto un altro progetto lib / framwork all'interno del progetto dell'app, è necessario spostare le intestazioni (se presenti) da pubbliche a progetti nella fase di compilazione / Copia intestazioni .

costruire la fase del tuo obiettivo lib / framwork


3
Stavo per perdere la speranza, poiché Skip Install to Yes non funzionava per me. Copiare le intestazioni su Project ha fatto il trucco per me. Grazie!
ksm,

10
Per aiutarti a localizzare il sottoprogetto Xcode difettoso, puoi mostrare l'archivio Xcode generico nel Finder ed esplorare il pacchetto. All'interno di .xcarchive, vedrai le intestazioni difettose in Prodotti / usr / local / include.
Monsieur,

1
Perché mettere alcuni file per copiare le intestazioni in pubblico rovinerebbe tutto questo?
mskw

mskw, immagino che se il manufatto creato contenga una o più intestazioni pubbliche non può diventare un archivio "dispiegabile da dispositivo" (Archivio app iOS da cui si genera un IPA). Rimane un archivio di progetti Xcode. Grazie
ebtokyo il

1
accidenti, grazie, ha funzionato per me .. Mi chiedo come diavolo riesci a trovare questo tipo di soluzioni :)
Fabio Napodano,

45

Ho fatto quanto segue per farlo funzionare per me:

  1. Avevo una libreria statica tre20, ho usato cocoapods per includere i file all'interno del progetto principale
  2. ha seguito l'installazione skip per tutti gli altri sottoprogetti / librerie statiche e ha cambiato le intestazioni di copia da pubblico a progetto come indicato sopra
  3. ancora più importante: in ogni libreria il tuo progetto usa andare per costruire fasi -> Copia file e assicurati che la destinazione sia cambiata da Absolute patha products directory. Nota: vedere il suggerimento di seguito per restringere la ricerca per trovare la libreria che causa questo errore.

e questo è tutto!

suggerimento: per avere un'idea dei file offensivi che stanno causando al tuo archivio di creare un file di archivio anziché un ipa, procedi nel seguente modo:

  1. Seleziona l'archivio e fai clic sul pulsante Distribuisci.
  2. Seleziona l'opzione "Salva prodotti costruiti".
  3. Premi Avanti e Salva.
  4. Sfoglia la directory creata nel Finder.
  5. La sottodirectory "librerie" identificherà le librerie necessarie per impostare Ignora installazione su Sì.
  6. in alcuni casi usr/local/includeidentificherai i file di intestazione colpevole che devi spostare da Pubblico a Progetto o i file che devi cambiare dal percorso assoluto alla directory dei prodotti (o anche i file che hai dimenticato di impostare skip install su yes flag). ma quella directory (cioè usr / local / include) varia a seconda della struttura della directory del tuo sublibrary. In molti casi .. vedrai tutti i file elencati in Copia file nel passaggio 3 sopra elencati qui. Se li trovi qui, allora hai una risposta definitiva per la causa del tuo problema.

aggiorna al suggerimento: per rendere la vita ancora più semplice .. qualunque file appaia al punto 4 nel suggerimento sopra .. basta cercarlo nella ricerca globale di xcode .. e dovresti ottenere risultati immediati per quello che vuoi .. per esempio, questo era il contenuto della mia cartella (seguendo i passaggi nel suggerimento sopra):

inserisci qui la descrizione dell'immagine

Quindi potrei dire che ha qualcosa a che fare con il librerie crypto e ssl ... cercandole:

inserisci qui la descrizione dell'immagine

mi ha fatto capire che ho dimenticato di impostare skip install su yes.


Ottimo suggerimento! Avevo cambiato alcune intestazioni del framework in "Privato"; per qualche motivo, ciò li stava causando la loro copia ./usr/local/include.
Ben Mosher,

1
è sempre un piacere poter dare una mano a @BenMosher :)
circa l'

1
La migliore risposta che ho ricevuto. Grazie per il suggerimento, mi ha salvato la giornata. !
Neywen,

Sicuramente la risposta che stavo cercando: il salvataggio dei prodotti build mi ha indicato la causa esatta del problema.
Dennis L,

Questa risposta esaustiva con "Save Built Products" è molto utile - @abbood, grazie mille a te. Spero di poter restituire il favore un giorno.
Scott Corscadden,

21

Se esporti l'archivio, aprilo e vedi /urs/local/includein Prodotti prova questo suggerimento :

In ogni pod, sotto Packaging, Private Headers Folder Pathed Public Headers Folder Pathè impostato su /usr/local/include. Se li cancello quindi ottengo un archivio valido.

inserisci qui la descrizione dell'immagine

Ha funzionato per me dopo aver aggiornato la mia app React Native a 0.11.0, Xcode 7e CocoaPods 0.39.0.beta.4.


1
Posso confermare che funziona! Fintanto che ti ricordi di cancellare i percorsi di intestazione sia privati ​​che pubblici. È anche abbastanza semplice, se selezioni tutti i pod, cerca il percorso dell'intestazione, quindi cancellali tutti allo stesso tempo.
Dids,

1
Posso anche confermare che funziona, mi ha risparmiato un sacco di tempo, questo è successo quando ho aggiornato i miei pod alla versione 0.39.0.beta
Bryan P

Eccezionale. Ha funzionato per me :) Ho lottato per 1 giorno e mezzo. Grazie, grazie, grazie :) :) :)
Srikanth,

Penso che questo sia quello che ha funzionato per me Xcode 7.0 iOS9. Non ho cocoapodi, ma questo ha risolto il problema comunque. Grazie amico
Geoff H,

Inoltre, ho dovuto impostare SKIP_INSTALL su Sì sull'estensione e sull'app WatchKit affinché funzioni.
Pupazzo di neve,

12

Se stai usando CocoaPods, WatchKit o un'estensione di oggi, c'è un problema aperto nel repository CocoaPods che spiega quale potrebbe essere il tuo problema.

La soluzione per me è stata quella di rimuovere la Copy Pod Resourcesfase dagli obiettivi Estensione estensione WatchKit e Oggi sotto Build Phases. Il progetto è stato compilato e archiviato come previsto una volta fatto questo.

Spero che questo aiuti qualcuno, questo mi ha lasciato per un giorno intero!


1
@ Lewis42 potrebbe sempre aggiungere una taglia;)
rebello95

Non vedo un'opzione per, un voto positivo sul tuo commento dovrà fare;)
lewis

@ Lewis42 dovresti aggiungere la generosità alla domanda e assegnarla a una risposta lol
rebello95

@ rebello95, rock amico!
Matt,

10

Se una delle risposte di cui sopra non funziona, il problema è probabilmente con cocoaPods. L'ultimo aggiornamento mi ha 0.38.1incasinato le cose, ma poi ho effettuato il downgrade 0.37.1e le cose sono tornate alla normalità. utilizzandoXcode 6.3.1

Modifica successiva: l' aggiornamento a 0.38.2risolverà anche questo. Maggiori informazioni su ciò che ha causato questo problema qui: Cocoapods 0.38.1 non è riuscito a creare un archivio valido


3
Ho aggiornato 0.38.2e ho ancora problemi. Sei su Xcode 7?
Porter Hoskins,

@PorterHoskins Ho appena scritto questo problema in quanto Xcode 7 NON costruirà un archivio valido dallo stesso progetto che crea un archivio valido in Xcode 6 . Sto usando Cocoa Pods 0.38.2, quando si utilizza Xcode 6 tutto va bene, ma con Xcode 7 l'archivio non è stato creato correttamente. Hai controllato la struttura delle tue cartelle per vedere se hai un file .appex al di fuori del tuo .app nel pacchetto?
Orso polare

Ho un quadro a /Library/Frameworks. Penso che potrebbe avere qualcosa a che fare con i baccelli di cacao di Google che non vengono creati come un quadro dinamico. Sembra simile a github.com/CocoaPods/CocoaPods/issues/3889
Porter Hoskins

3
Mi sono trasferito per tutte le intestazioni di pod in Build Phases / Headers nella sezione del progetto da pubblico e ha funzionato. Quindi in effetti il ​​problema potrebbe essere nei CocoaPods.
Denis Kutlubaev,

7

Anche se sto usando Xcode5 e ciò che lo ha ordinato per me è stata la modifica del Build Scheme - provare tutti i suggerimenti di cui sopra che erano applicabili non ha aiutato nel mio caso.

Avevo due obiettivi, ad esempio "App" e "App FREE". I miei problemi con l'archivio generico si sono verificati quando stavo cercando di archiviare la versione GRATUITA, che ho aggiunto dopo la versione "normale" dell'app. Nel mio caso, quando ho selezionato il suo schema nella barra degli strumenti e ho scelto Modifica schema ... Ho visto che la sezione Build aveva due obiettivi, vale a dire App e App FREE.

Ho deselezionato tutte le colonne per App, lasciando selezionate solo le colonne di App FREE e ho fatto clic su OK. La prossima volta che ho scelto Prodotto> Archivio, ho ottenuto la mia app GRATUITA anziché un archivio generico. :)


7

Se hai un solo progetto, forse questa soluzione sarebbe utile. Questo problema si era verificato quando ho duplicato l'obiettivo. Di conseguenza ho costruito due obiettivi in ​​parallelo. Questo stava causando il problema. È stato creato un archivio IOS generico.

Per disattivare il parallelo costruito, vai a

  • Gestire schemi,
  • Modifica schema,
  • Costruire,
  • Rimuovi l'altro bersaglio.

5

Ho avuto questo problema dopo l'aggiornamento a iOS 9 e Xcode 7. La soluzione di Josh H ha funzionato per me:

In ogni contenitore, in Imballaggio, il percorso della cartella delle intestazioni private e il percorso della cartella delle intestazioni pubbliche è impostato su / usr / local / include. Se li cancello quindi ottengo un archivio valido.

Ho anche creato uno script post installazione per il mio Podfile per farlo automaticamente!

    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

Aggiungilo in fondo al tuo Podfile ed eseguilo pod install


5

Ho più progetti nel mio spazio di lavoro (GTL, Pods e il mio progetto principale) e questo è ciò che ha funzionato per me:

Seleziona il Progetto, ci saranno 2 tipi lì, c'è il Progetto e ci sono i Target .

Per progetti che non sono i tuoi principali like GTLo PODS:

progetti:

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

obiettivi:

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

Per il progetto principale (che di solito è chiamato come il nome del tuo prodotto):

progetti:

Skip Install = NO
Installation Directory = /Applications

obiettivi:

Skip Install = NO
Installation Directory = /Applications

Controllare la destinazione di distribuzione iOS su ciascun progetto e destinazione per assicurarsi che siano tutti uguali.


Grazie per averlo spiegato passo dopo passo. mi ha davvero aiutato a risolvere il mio problema.
Arslan,

4

Ho avuto questo problema. Nel mio caso, è stato causato mantenendo una destinazione dell'app Mac come dipendenza dell'app iOS.

Il motivo per cui è stato configurato in questo modo è che l'app per Mac era uno strumento utilizzato per generare alcuni dati per l'app per iOS, che è stata quindi inclusa nel pacchetto.

Ho dovuto rimuovere quella dipendenza e creare lo strumento separatamente prima di creare una stessa app per iOS.


Le librerie come lippd hanno sia i target ios che osx, ho dimenticato di rimuovere il target osx ... doh
james_alvarez

4

Nel mio scenario stavo ottenendo l'errato "archivio generico" solo dopo aver iniziato a includere il codice Swift nel mio progetto prevalentemente Objective-C. Dopo un sacco di risoluzione dei problemi e di esame del file di archivio che Xcode stava sputando, ho notato che la SwiftSupportcartella (con i dylibs richiesti per il runtime di Swift) si trovava in una posizione diversa nel mio archivio rispetto a un nuovissimo archivio di app per progetti Swift nuovo di zecca .

Ho trovato l' Installation Directoryimpostazione di build e ho notato che era impostato su un percorso personalizzato nel mio progetto. L'ho semplicemente cancellato (impostandolo sul suo valore generico di /Applications) e il prossimo Build -> Archive ho funzionato come previsto e mi ha dato un archivio app iOS corretto.

TL; DR: assicurati che l' Installation Directoryimpostazione di compilazione sia impostata sul valore predefinito /Applicationsquando includi il codice Swift nella tua app, soprattutto se stai iniziando con un file di progetto precedente che potrebbe avere alcune impostazioni di build legacy impreviste.


3

Lasciandolo qui per salvare gli altri dallo stesso viaggio.

Ho scoperto che dovevo rimuovere la stessa fase di compilazione delle risorse del pod di copia da una destinazione di libreria statica nell'area di lavoro.


dopo aver provato molte delle cose sopra, questo ha funzionato per me (Xcode 7)
humphriesj

2

Aggiunta alla risposta di Alex L.

Punto 3. Modifica 'Impostazioni build' -> 'Percorso cartella intestazione pubblica' in 'include / xxx' funziona anche.


Questo è più corretto del n. 3 sopra. Le intestazioni devono essere pubbliche se stai costruendo una libreria statica
bcattle,

2

Se nessuno dei precedenti ti ha aiutato ... dopo molto tempo .......

Ho eliminato il valore in Info.plist per la versione bundle perché ero abbastanza felice con solo la versione bundle 1.0 breve.Male. Non farlo

* Nota che in realtà l'ho fatto modificandolo nell'interfaccia utente a destra senza rendermi conto che avrebbe messo una chiave vuota nel file Info.plist. Penso che lo renda invalido. Il mio bundle è apparso come altri elementi durante l'archiviazione e non aveva l'icona e non sono riuscito a caricarlo da nessuna parte.

Questo si riduce a valori non validi in Info.plist. Se non è un archivio valido, prova a decomprimere un vecchio archivio e rilasciarlo / sovrascriverne quello corrente e vedere se lo corregge durante la ricostruzione dell'archivio.


1
  1. Vai a Build Settings e aggiungi

    yourAppName / Resources / dist.plist ai diritti di firma del codice

  2. Premi cmd + B con il dispositivo iOS o un dispositivo reale selezionato come Build Build

  3. Al termine -> scorrere fino alla cartella "Prodotti" e fare clic con il tasto destro del mouse su NomeApp.app

  4. Scegli "Mostra nel Finder"

  5. Crea una cartella con nome Payload ( maiuscola "P" )

  6. Copia yourAppName nella tua cartella Payload

  7. Crea una zip dalla cartella Payload

  8. Rinomina lo zip in yourAppName.ipa

FATTO


1

Dopo aver provato praticamente tutto:

  • Pulito, Archivio
  • elimina DerivedData, Archive
  • riavvia Xcode (stavo usando XCode7), Archive
  • combinazioni di cui sopra ...

Ho quindi notato che la mia partizione di avvio era "a corto di spazio libero su disco" ... circa 1 GB o giù di lì. Ho riavviato, quindi ho ottenuto circa 18 GB gratuiti.

Quindi ho aperto Xcode e project, ho eseguito Archive ... e sorprendentemente (dopo un'ora di tentativi di creare un Archive) ho finalmente ottenuto un Archive non generico.

Non ho idea se è un problema di disco libero che lo ha riparato o un riavvio di macOS che lo ha riparato, ma ha funzionato per me.



0

Nel mio caso, ho dovuto spostare sia FMDB che BlocksKit su librerie statiche. In precedenza erano costruiti come sottoprogetti. Ricorda che puoi usare lipo per creare librerie universali. Quando si creano i prodotti finali, il codice del simulatore verrà rimosso automaticamente.


0

Un altro possibile motivo di ciò è avere riferimenti in "Dipendenze target" a progetti per una piattaforma diversa. Nel mio caso particolare, stavo lavorando a un progetto che condivide il codice per OSX e iOS. In uno dei target iOS, avevo accidentalmente aggiunto un target OSX come dipendenza.


0

Per essere accurato, sto pubblicando la mia soluzione.

Ho riscontrato lo stesso identico problema nel provare a creare un archivio di un progetto iOS in Xcode 5.1.1 (5B1008). Nessuno dei suggerimenti di cui sopra ha risolto il problema e la maggior parte di essi era irrilevante (non avevo aggiunto alcun framework e non avevo voci pubbliche nella sezione Copia intestazioni delle mie fasi di creazione).

Nel mio caso, risolvere il problema consisteva semplicemente nel chiudere il mio progetto, eliminare tutti gli archivi che avevo precedentemente realizzato, andare su Preferenze> Account, rimuovere il mio account sviluppatore, uscire da Xcode, riavviare, aggiungere nuovamente il mio account sviluppatore, avviare il processo di archiviazione ancora. Ciò ha risolto immediatamente il mio problema.


0

Un'altra soluzione, dal momento che tutto quanto sopra non ha funzionato per me ...

Modificato il User Header Search Paths(suppongo Header Search Pathsfunzionerebbe altrettanto elegantemente) in "$(BUILT_PRODUCTS_DIR)/BlocksKit".

Contesto :

In BlockKit, gli sviluppatori hanno strutturato le intestazioni nel progetto principale in modo diverso rispetto alla struttura durante l'implementazione. Pertanto, non è possibile fare riferimento alle intestazioni nel progetto e fare riferimento alle intestazioni copiate nella directory di generazione.


0

Il modo in cui ha funzionato per me in (Xcode 5) avevo 2 target e quando ho modificato lo schema, nel riquadro sinistro dell'editor dello schema, vedrai il [BUILD, RUN, TEST, PROFILE XXX.APP, ANALYZE, ARCHIVE ] dal riquadro BUILD, vedrai i target del tuo progetto elencati in un elenco. All'estrema destra vedrai le selezioni ARCHIVIO, assicurati che sia selezionato un solo bersaglio per l'archiviazione.

Avevo selezionato 2 dei miei obiettivi nel mio progetto, ho verificato solo l'obiettivo desiderato nel prodotto e ha funzionato!


0

Ho risolto questo errore aprendo esclusivamente il progetto dell'app in XCode, ovvero. non aprire uno spazio di lavoro comprendente l'applicazione e altri progetti / librerie / framework.

Avendo 2 progetti separati, un framework o una libreria condivisa e un'applicazione iOS, ho dovuto aprire 2 diverse finestre XCode, ognuna aprendo direttamente il file .xcodeproj invece del comune .xcworkspace , al fine di costruirle rapidamente.

Come un piacevole effetto collaterale, XCode non ricostruisce più ogni destinazione di ogni progetto dopo aver eseguito una pulizia , con conseguente riduzione dei tempi di costruzione.

Sfondo: sto creando un SDK open source e un'applicazione demo per iOS. Avevo entrambi aperto in un unico spazio di lavoro. L'impostazione Ignora installazione su sulle destinazioni SDK impedirebbe a chiunque di creare un archivio, poiché sarebbe vuoto, quindi questa non era un'opzione. L'uso di Project anziché delle intestazioni pubbliche porterebbe a un archivio privo dei file di intestazione che dovrebbero essere distribuiti, quindi neanche questa era un'opzione.


0

Perché era perché stavo lavorando in un'area di lavoro. Il progetto è stato archiviato ma non verrà visualizzato nella finestra dell'organizzatore. Ho chiuso l'area di lavoro e aperto il progetto da solo. L'archivio è stato aperto nell'organizzatore ... spero che sia d'aiuto.


0

Nel mio caso, avevo uno script personalizzato che stava copiando alcuni file temporanei in:

${TARGET_BUILD_DIR}/myTempDir

Ciò significava che, dopo aver esaminato l'archivio per verificarne il contenuto, ho trovato proprio accanto al file .app una cartella myTempDir. Una volta ho modificato lo script per salvare altrove le cose sono state ordinate.


0

Prova a impostare le intestazioni $ (PROJECT_NAME) nel percorso della cartella delle intestazioni pubbliche di Projet Framework. Devi andare per creare le impostazioni del Target libreria quindi modificare il percorso della cartella delle intestazioni pubbliche come intestazioni $ (PROJECT_NAME).


0

Se si utilizza Xcode 7 con cocoapods v.0.38.2 . Prova a rimuovere copy pod resourcesdal tuo obiettivo di estensione oggi.

inserisci qui la descrizione dell'immagine


0

Ho riscontrato questo problema dopo aver aggiunto uno strumento da riga di comando OS X al progetto della mia app iOS e Skip Install era impostato su NO per impostazione predefinita per la destinazione dello strumento da riga di comando. Dal momento che ovviamente non è possibile installare un binario OS X su un dispositivo iOS, l'archiviazione è predefinita in un archivio Xcode generico. L'impostazione Ignora installazione su SÌ per questa destinazione ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.