Come creare per architetture armv6 e armv7 con iOS 5


96

In iOS5 Apple rilascia l' architettura armv6 da ARCHS_STANDARD_32_BIT .

Per mantenere il supporto per iPhone3G voglio comunque compilare in armv6 anche in iOS5.

Qualcuno ha trovato una soluzione per questo?

Risposte:


96

Ho appena creato qualcosa oggi specificando un obiettivo di distribuzione di iOS 4.0. Con solo armv7 specificato in Architectures, Xcode mi ha avvertito che per supportare qualsiasi cosa al di sotto di iOS4.2 dovevo includere armv6 in Architectures. Basta modificare quel campo, fare clic sul pulsante "+" quando viene visualizzata la finestra di dialogo e immettere il letterale "armv6".

Nel mio caso, vogliamo che la nostra app funzioni con iOS4 e iOS5. Abbiamo dovuto apportare alcune modifiche in modo che funzionasse correttamente con iOS5, ma tutte queste modifiche sono state apportate con modifiche al codice compatibili con iOS4.

Abbiamo anche aggiunto alcune funzionalità specifiche per iOS5 in modo da consentire l'esecuzione dell'app senza crash su iOS4. In particolare, abbiamo testato le funzionalità di iOS5 prima di provare a utilizzarle e abbiamo collegato le librerie solo iOS5 come facoltative.

Quindi, supportare iPhone3G in un mondo iOS5 potrebbe significare altrettanto facilmente "vogliamo che la nostra app funzioni su iOS4 e versioni successive (indipendentemente dall'uso delle funzionalità di iOS5)" piuttosto che "vogliamo assicurarci che la nostra app funzioni su un vecchio dispositivo con iOS5 ". C'è una differenza qui; pensaci. :-)

Ad ogni modo, aggiungere di nuovo il supporto armv6 è molto semplice. E immagino che il punto sia questo: a un certo punto, quando non ci saranno più dispositivi armv6 là fuori di cui preoccuparsi (per qualsiasi motivo) non dovrai costruire per questo. Il punto di vista di Apple è che tutti dovrebbero eseguire l'aggiornamento all'hardware più recente il prima possibile. Quindi, in quel mondo, non è necessario che gli strumenti impostino per impostazione predefinita altro che l'ultimo e il migliore. :-) Fortunatamente (o no), noi sviluppatori viviamo nel mondo reale e riconosciamo che devi supportare cose più vecchie per un po '. E immagino che anche il team di sviluppo di Xcode lo sappia, motivo per cui puoi aggiungere il supporto di armv6 in modo abbastanza semplice.


3
Grazie per la tua risposta precisa :-) In effetti voglio essere in grado di eseguire la mia app su un iPhone 3G con iOS 4.2.1 o inferiore (limitando a 4.0) e avere alcune funzionalità specifiche di iOS 5 per i dispositivi attuali. Non ho provato ad aggiungere semplicemente "armv6" nelle architetture, stavo cercando una variabile d'ambiente come ARCHS_STANDARD_32_BIT e ho appena trovato ARCHS_UNIVERSAL_IPHONE_OS ma non sembra funzionare.
iGranDav

3
Volevo aggiungere che molte soluzioni là fuori suggeriscono che dovrebbe dire "armv6 armv7" - questo non ha funzionato per me. Al momento solo "armv6 $ (ARCHS_STANDARD_32_BIT)" funziona per me, il che significa non sbarazzarti di quello che c'è, aggiungi semplicemente "armv6" all'impostazione Architectures
brack

1
Ho fatto tutto questo e la mia build continuava a fallire - il motivo era che avevo una build di rilascio (non utilizzata) impostata su un obiettivo di distribuzione di iOS 5.0 mentre il debug e la distribuzione erano impostati su 3.0 e questo sembra interrompere la creazione di xcode per armv6. L'impostazione dell'obiettivo di distribuzione su 3.0 per tutte le build ha risolto il problema.
Simon East

6
Non ha funzionato per me (anche dopo aver aggiunto "armv6"). L'app non è nemmeno apparsa sul mio iPod touch. Ma poi ho scoperto che "Required Device Capabilities" (nella scheda info) conteneva armv7. L'ho appena cancellato e ha iniziato a funzionare perfettamente
Erpheus

1
In genere uso $ (VALID_ARCHS), che funziona per me. Ho appena scoperto che i nuovi progetti aggiungono anche un requisito di capacità "arm7". L'ho appena cancellato e tutto funziona bene.
Gordon Dove il

51

La semplice risposta è che devi cambiare le impostazioni correnti da "Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)" per essere solo "armv6" e "armv7". Guarda l'immagine qui sotto. È necessario eliminare la riga con le impostazioni precedenti affinché funzioni.

Impostazioni corrette per armv6 e armv7


3
Grazie per averlo spiegato con un'immagine: è stato davvero chiaro.
radven

11

assicurati anche di impostarlo in Progetto AND Obiettivi ... mi è costato un'ora per capirlo. l'avevo impostato per uno ma non per l'altro. spero che questo ti aiuti. GLTA


Inoltre, se hai delle librerie, devi impostarle nel progetto e le destinazioni lì.
William Jockusch

9

Penso che ci sia un motivo per cui Apple ha abbandonato armv6 dall'impostazione standard.

Ho compilato armv7 / armv6 con iOS5 SDK, tuttavia, il compilatore armv6 ha prodotto codice errato in modalità di rilascio. Dopo ore passate a trovare una soluzione alternativa (provando llvm o gcc con diversi livelli di ottimizzazione) mi arrendo.

Quindi, tornerò a iOS SDK 4.x fintanto che supporto i vecchi dispositivi armv6.

Esempio di codice:

// myView center=(160, 100)
CGPoint p=myView.center;  
// now p=(100,100) (what the heck?)
p.x=myView.center.x;
p.y=myView.center.y;
// now p=(160,100) 
p.y+=100;
// now p =(200,200) (what the heck?)

Forse ho un po 'di danneggiamento della memoria, tuttavia, sul compilatore armv7 e su iOSSDK <5.0 si comporta come previsto.

I migliori saluti


Vedo anche strani bug nelle build di armv6 su dispositivi meno recenti. Hai capito questo o sei davvero tornato a un XCode precedente? Inoltre noto che non ti consentono più di scaricare i vecchi SDK!
Craig McMahon

19
Questo è un problema noto con il compilatore LLVM 3.0 in Xcode 4.2 e le strutture CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . Disabilitare la creazione di Thumb su armv6 previene questo tipo di errori.
Brad Larson

Wow! Sono così felice per la tua risposta, questo sta accadendo anche a me.
Clafou

7

Non sono sicuro che questa sia ancora una soluzione, ma ho scoperto che sostituire la stringa definita in "architetture", che era $ (ARCHS_STANDARD_32_BIT), con "armv6 armv7" mi ha permesso di compilare con iOS5 come base e iOS4 come distribuzione target e passare la convalida.

Non sto usando librerie o chiamate esclusive di IOS5, ma intendo farlo nella prossima versione.


1

Non avevo bisogno di sostituire $ (ARCHS_STANDARD_32_BIT) con solo armv7 per compilare l'app e caricarla su App Store.

Come suggerito da MarkGranoff, ho semplicemente aggiunto armv6 come testo normale, premendo più e semplicemente digitandolo sulla riga due.

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.