2009-05-04 19 views

risposta

89

È possibile utilizzare questo # define per cambiare ciò che si costruisce per ogni SDK ...

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2 
// iPhone 3.0 code here 
#endif 

e fare questo in fase di esecuzione per eseguire il codice per la 3.0 e superiori:

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
if (version >= 3.0) 
    { 
    // iPhone 3.0 code here 
    } 
+0

Non lo sapevo. Grazie! – Kriem

+0

Grande, grazie! – Oliver

+10

Una cosa da tenere presente è che la compilazione per il simulatore contro il dispositivo può causare cambiamenti sorprendenti in queste macro. Durante la compilazione per il simulatore SDK 2.2.1 ottengo __IPHONE_OS_VERSION_MIN_REQUIRED = 20000. Durante la compilazione per il dispositivo, tuttavia, ottengo __IPHONE_OS_VERSION_MIN_REQUIRED = 20201, che interrompe la condizione che hai definito sopra. Al momento sto utilizzando "#ifdef __IPHONE_3_0" per isolare il codice che funziona solo in versione 3.0 o successiva. Funziona perché la macro non è definita fino all'SDK 3.0. – n8gray

0

È nelle opzioni di generazione di Xcode. Il menu a discesa nell'angolo in alto a sinistra che dice qualcosa come "myapp - 3.0 | Debug" Seleziona la build che vuoi e presto, hai fatto.

+0

Il problema con questo metodo è che voglio che la mia app funzioni anche su 2.2.1, con solo questa riga di codice in esecuzione su 3.0. Il tuo metodo significherebbe che dovrei abbandonare il supporto per 2.2x. – Oliver

+0

Capisco cosa intendi ora, difficile, ma potresti essere in grado di fare un controllo puntuale. Dì controlla la presenza di una definizione in un'intestazione. –

0

Utilizzando il trucco di aggiungere OTHER_CFLAGS = "-g3 -save-temps -dD" da this answer, ho trovato che definire __IPHONE_OS_VERSION_MIN_REQUIRED 20000 con un progetto mirato a 2.2.1. Forse funzionerà?

0

Sono abbastanza certo che il commento sull'OP lo riassuma. Non puoi Perché una direttiva sul tempo di compilazione non può prendere una decisione di runtime. In Xcode, se scegli come target 3.0, non verrà eseguito su un telefono 2.2.1. Se scegli come target 2.2.1, non verrà compilato perché hai codice 3.0 specifico.

L'unica vera soluzione sarebbe due versioni della tua app, una delle quali è compilata per 3.0 e l'altra per 2.2.1.

+0

Primo: l'OP non sta escludendo i controlli di compilazione. 2 °: ci sono delle eccezioni alla tua regola. Ad esempio, MPMoviePlayerController esiste su 3.0 e su 3.2 ma funziona diversamente su 3.2 (e 4.0) - per supportarlo correttamente su entrambe le piattaforme, ho trovato che usare un controllo di versione-runtime-os molto utile. Nel mio caso particolare, omettere questo controllo porterà comunque a una build corretta su entrambe le piattaforme, ma si bloccherà su qualcosa di sotto 3.2. – Till

-2

Bene, i miei due centesimi:

Che ne dici di costruire la tua app con la versione più recente di 3.0 in modo da poter sfruttare tutte le nuove API & e specificare il target di distribuzione come il meno recente versione che vuoi supportare, quindi ragazzi là fuori che non hanno avuto il tempo di aggiornare i loro dispositivi eseguiranno la tua app. In questo caso, come mostrato sopra, è necessario verificare la versione meno recente dell'SDK e fornire funzionalità alternative per rendere l'applicazione compatibile all'indietro.

saluti, Hardik

+0

In che modo questo aiuta solo a eseguire un blocco di codice su iOS 3 o versioni successive? –

4

Abbastanza sicuro che si può anche fare:

#ifdef __IPHONE_3_0 
// 3.0 code here 
#endif 
+0

Nota che il codice per andare lì è 3.0+, non solo 3.0. –

6

UPDATE: Quando si costruisce & in esecuzione su iPhone (4.3.1) utilizzando Xcode 4, questo non è più sembra funzionare per me. Inoltre, ottengo __IPHONE_OS_VERSION_MIN_REQUIRED = 30200.

The iPhone Developer's Cookbook dice che si può anche fare:

#ifdef _USE_OS_4_OR_LATER 
    // code to compile for 4.0 or later 
#else 
    // code to compile for pre-4.0 
#endif 

E, sembra funzionare per me. :)

+0

Non riesco a trovare dove potrebbe essere definito in Foundation. Dov'è? –

19

Starei attento con il risultato di ritorno floatValue:

[[[UIDevice currentDevice] systemVersion] floatValue] 

Come con qualsiasi galleggianti, potrebbe non essere esattamente quello che ci si aspetta.Quando si esegue il sopra sul mio sistema, confuso perché la mia istruzione condizionale non è stato in esecuzione, ho notato il valore riscontrato è:

3.20000005 

Raccomanda le soluzioni qui invece: How to check iOS version?

Estratto:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch]; 
if (order == NSOrderedSame || order == NSOrderedDescending) { 
    // OS version >= 3.1.3 
} else { 
    // OS version < 3.1.3 
} 
+0

Il '3.2.00..005' presenta ancora un problema con' doubleValue'? –

+0

@ BenC.R.Leggiero dovrebbe essere. È impossibile rappresentare 3.2 esattamente in binario, indipendentemente dalla precisione che si usa. –

+0

@BrennanVincent Penso che tu intenda con i float IEEE, dato che è banale rappresentare usando 'NSDecimalNumber' –

Problemi correlati