2011-09-20 11 views

risposta

96

Ho appena realizzato 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 sotto iOS4.2 dovevo includere armv6 in Architectures. Basta modificare quel campo, fare clic sul pulsante "+" quando appare la finestra di dialogo e inserire il letterale "armv6".

Nel mio caso, vogliamo che la nostra app funzioni su iOS4 e iOS5. Abbiamo dovuto apportare alcune modifiche affinché funzionassero correttamente con iOS5, ma tutte quelle modifiche sono state apportate con modifiche al codice compatibili con iOS4.

Abbiamo anche aggiunto alcune funzionalità specifiche di iOS5 in un modo che consente all'app di funzionare senza crash in iOS4. Nello specifico, abbiamo testato le funzionalità di iOS5 prima di provare a utilizzarle e ho collegato librerie solo iOS5 come Opzionali.

Quindi, supportare iPhone3G in un mondo iOS5 potrebbe anche significare "vogliamo che la nostra app venga eseguita su iOS4 e versioni successive (indipendentemente dall'uso di qualsiasi funzione iOS5)" piuttosto che "vogliamo assicurarci che la nostra app venga eseguita su dispositivo precedente con iOS5 ". C'è una differenza qui; pensaci. :-)

In ogni caso, aggiungere nuovamente il supporto armv6 è molto semplice. E immagino che il punto sia questo: ad un certo punto, quando non ci sono più dispositivi armv6 là fuori a preoccuparsi (per qualsiasi motivo) non dovrai costruirlo per questo. La visione di Apple è che tutti dovrebbero aggiornare l'hardware più recente il prima possibile. Quindi, in quel mondo, non c'è bisogno che gli strumenti siano predefiniti a tutto tranne che ai più recenti e ai più grandi. :-) Fortunatamente (o meno), noi sviluppatori viviamo nel mondo reale e riconosciamo che devi supportare le cose più vecchie per un po '. E credo che anche il team di sviluppo di Xcode lo sappia, ed è per questo che puoi aggiungere il supporto armv6 in un altro modo.

+3

Grazie per la tua risposta precisa :-) Effettivamente 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 caratteristiche specifiche di iOS 5 per i dispositivi attuali. Non ho provato semplicemente aggiungendo "armv6" nelle architetture, stavo cercando una variabile di 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. Attualmente solo "armv6 $ (ARCHS_STANDARD_32_BIT)" funziona per me, cioè non sbarazzarsi di ciò che è lì, basta aggiungere "armv6" all'impostazione Architectures – brack

+1

Ho fatto tutto questo e la mia build non funzionava ancora - la ragione era che avevo un (inutilizzato) La build di rilascio è stata impostata su una destinazione di distribuzione di iOS 5.0 mentre Debug e Distribution erano impostati su 3.0 e questo sembra arrestare la creazione di xcode per armv6. L'impostazione dell'obiettivo di distribuzione su 3.0 per tutti i build ha risolto il problema. –

7

Non sono sicuro se questa sia effettivamente 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 target di implementazione e passa la convalida.

Non sto usando alcuna libreria o chiamata esclusiva di IOS5, ma intendo farlo nella mia prossima versione.

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 di trovare una soluzione alternativa (provando llvm o gcc con diversi livelli di ottimizzazione) mi arrendo.

Quindi, torno a iOS SDK 4.x finché supporto i dispositivi armv6 meno recenti.

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 mi hanno qualche corruzione della memoria, tuttavia, il compilatore ARMv7 e iOSSDK < 5.0 si comporta come previsto.

migliori saluti

+0

Sto anche vedendo strani bug nei build armv6 su dispositivi precedenti. Lo hai capito o sei tornato a un precedente XCode? Inoltre noto che non ti permettono più di scaricare gli SDK più vecchi! –

+19

Questo è un problema noto con il compilatore LLVM 3.0 nelle strutture Xcode 4.2 e CGPoint/CGSize: https://devforums.apple.com/thread/122059?tstart=15. Disabilitare la creazione di Thumb su armv6 impedisce questo tipo di errori. –

+0

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

51

La semplice risposta è che è necessario modificare le impostazioni correnti da "Standard (ARMv7) - $ (ARCHS_STANDARD_32_BIT)" di essere solo "ARMv6" e "ARMv7". Guarda l'immagine qui sotto. Devi eliminare la linea con le impostazioni precedenti affinché funzioni.

Correct settings for armv6 and armv7

+3

Grazie per aver spiegato questo con un'immagine: è stato davvero chiaro. – radven

+0

Grazie. Questo ha funzionato per me. – Undistraction

+0

Risposta migliore di quella accettata. –

11

anche fare in modo di impostare questo nel progetto e gli obiettivi ... mi costi un'ora per capirlo. l'avevo impostato per uno ma non per l'altro. spero che questo ti aiuti. GLTA

+0

Inoltre, se si dispone di librerie, è necessario impostarlo in progetto e target lì. –

1

Non ho avuto bisogno di sostituire $ (ARCHS_STANDARD_32_BIT) con solo armv7 affinché l'app si compilasse e venisse caricata su App Store.

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

Problemi correlati