2015-01-07 21 views
10

Stavo osservando l'esempio di Apple Lister (for Apple Watch, iOS, and OS X). Il campione esegue un test per iOS e OS X:Macro preprocessore per Apple Watch?

#import <TargetConditionals.h> 

#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) 

@import ListerKit; 

#elif TARGET_OS_MAC 

@import ListerKitOSX; 

#endif 

Tuttavia, non v'è alcuna prova per TARGET_OS_WATCH o simili. Grep per watch in TargetConditionals.h non esprima alcun successi:

$ cat /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer 
    /SDKs/iPhoneOS7.1.sdk/usr/include/TargetConditionals.h | grep -i watch 
$ 

Da TargetConditionals.h, so che ci sono:

 These conditionals specify in which Operating System the generated code will 
    run. The MAC/WIN32/UNIX conditionals are mutually exclusive. The EMBEDDED/IPHONE 
    conditionals are variants of TARGET_OS_MAC. 

     TARGET_OS_MAC   - Generate code will run under Mac OS 
     TARGET_OS_WIN32   - Generate code will run under 32-bit Windows 
     TARGET_OS_UNIX   - Generate code will run under some non Mac OS X unix 
     TARGET_OS_EMBEDDED  - Generate code will run under an embedded OS variant 
            of TARGET_OS_MAC 
     TARGET_OS_IPHONE  - Generate code will run under iPhone OS which 
            is a variant of TARGET_OS_MAC. 
    TARGET_IPHONE_SIMULATOR  - Generate code for running under iPhone Simulator

Domanda: Esiste un preprocessore per l'orologio di Apple?


sto tagging con , ma non sono sicuro che sia il sistema operativo corretto per questa domanda.

L'elenco seguente è stato compilato da iPhone TargetConditionals.h. Il simulatore e OS X sono simili (hanno appena diversi bit impostato a 1):

#define TARGET_OS_MAC    1 
#define TARGET_OS_WIN32    0 
#define TARGET_OS_UNIX    0 
#define TARGET_OS_EMBEDDED   1 
#define TARGET_OS_IPHONE   1 
#define TARGET_IPHONE_SIMULATOR  0 

Domande: Fa l'uso dell'orologio TARGET_OS_EMBEDDED? L'orologio ometteTARGET_OS_IPHONE?

risposta

19

A partire da watchOS 2.0, è possibile eseguire il codice nativo sull'orologio, quindi questa è una domanda più pertinente.

Sto utilizzando la prima versione beta di watchOS 2, quindi potrebbe cambiare, ma al momento, TARGET_OS_WATCH è impostato su 1 su watchOS.

(Inoltre, fare attenzione: TARGET_OS_IPHONE è anche impostato a 1 su watchos, anche se TARGET_OS_IOS è 0.)

2

Con l'attuale SDK WatchKit, tutto il codice in un'applicazione Watch viene eseguito sul telefono con cui è accoppiato, quindi non c'è alcun punto in cui il preprocessore incontrerà il codice che verrà eseguito sull'Orologio e quindi non molto utilizzato per una macro per dirgli cosa fare quando lo fa. Il codice nel target ListerWatch dell'esempio a cui sei collegato verrà eseguito come un'estensione sull'iPhone e parlerà con l'interfaccia utente dell'orologio tramite WatchKit.

+0

Potresti avere una classe manager condivisa che richiama [UIApplication sharedApplication] che è vietata sulla watch ma sai che non sarà mai essere chiamato o potrebbe voler sovrascrivere usando questa macro. – ge0rges

8

Nessun condizionale o estensione dell'estensione per app condizionale. Ma puoi creare i tuoi condizionali per target che usi allo stesso modo.

Se si guarda nella sezione "Impostazioni di compilazione" per qualsiasi destinazione, c'è una sezione chiamata "Altri C Flags". Aggiungi una voce per il target WatchKit. Se aggiungi qualcosa come -DMY_WATCHKIT_FLAG=1, puoi quindi fare #if MY_WATCHKIT_FLAG nel codice.

Fai la tua bandiera personalizzata, beh, personalizzata. Non è impossibile che Apple possa aggiungere una bandiera in futuro chiamato qualcosa come TARGET_WATCH_APP o qualsiasi altra cosa. Usa un prefisso sul nome della bandiera per renderlo specifico per te.

+1

Al momento della domanda, avrei dovuto accettare questa risposta. Non sono sicuro del motivo per cui non l'ho fatto. Ma come il destino avrebbe voluto, Apple ha aggiunto "TARGET_OS_WATCH". Scusa per il ritardo. – jww

12

Potete trovare tutti i tipi di condizionali bersaglio nelle TargetConditionals.h (cmd + shift + oe tipo TargetConditionals.h).

In questo elenco è possibile trovare un elenco come questo e molti altri utili. Attualmente contiene TARGET_OS_WATCH da WatchOS 2.Per WatchOS 1 non è stato possibile eseguire il codice personalizzato sull'orologio, quindi non era necessario al momento, dal momento che tutto funzionava sul telefono stesso.

#define TARGET_OS_MAC    1 
#define TARGET_OS_WIN32    0 
#define TARGET_OS_UNIX    0 
#define TARGET_OS_IPHONE   1 
#define TARGET_OS_IOS    0 
#define TARGET_OS_WATCH    1 
#define TARGET_OS_TV    0 
#define TARGET_OS_SIMULATOR   0 
#define TARGET_OS_EMBEDDED   1 

Swift addizione

#if os(watchOS) 
    [Watch code] 
#else 
    [Code for iOS, appleTV, or any else clause] 
#endif 

Alcuni altri valori validi: iOS, OSX, TVOS

Una piccola spiegazione di questo e di più http://nshipster.com/swift-system-version-checking/

Al fondo di questo documento https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_15#Build Configurazioni Sotto il se ction 'Build Configurations' puoi trovare un elenco (speranzoso) aggiornato con tutti questi valori attualmente disponibili