2015-01-07 10 views
10

Ich schaute auf Apples Lister (for Apple Watch, iOS, and OS X) Probe. Die Probe führt einen Test für iOS und OS X:Preprozessor-Makro für Apple Watch?

#import <TargetConditionals.h> 

#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) 

@import ListerKit; 

#elif TARGET_OS_MAC 

@import ListerKitOSX; 

#endif 

Allerdings gibt es keinen Test für TARGET_OS_WATCH oder ähnliches. Greppen für watch in TargetConditionals.h liefert keinen Treffer:

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

Von TargetConditionals.h, ich weiß, gibt es:

 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

Frage: Gibt es einen Präprozessor für Apples Uhr?


Ich Tagging mit , aber ich bin mir nicht sicher, dass die richtigen OS für diese Frage sind.

Die folgende Liste wurde von iPhone's TargetConditionals.h kompiliert. Der Simulator und OS X ähnlich sind (sie haben nur unterschiedliche Bits auf 1 gesetzt):

#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 

Fragen: Ist die Verwendung TARGET_OS_EMBEDDED Uhr? Ist die Uhr weglassenTARGET_OS_IPHONE?

Antwort

19

Ab watchOS 2.0 können Sie nativen Code auf der Uhr ausführen, daher ist dies eine wichtigere Frage.

Ich benutze die erste frühe Beta von watchOS 2, also kann sich das ändern, aber im Moment wird TARGET_OS_WATCH auf watchOS auf 1 gesetzt.

(Achten Sie auch darauf: TARGET_OS_IPHONE auch auf 1 auf watchOS gesetzt, obwohl TARGET_OS_IOS 0 ist)

2

Mit dem aktuellen WatchKit SDK läuft der gesamte Code in einer Watch-Anwendung auf dem Telefon, mit dem er gekoppelt ist. Es gibt also keinen Punkt, an dem Ihr Präprozessor auf Code trifft, der auf der Watch ausgeführt wird ein Makro, um zu sagen, was zu tun ist, wenn es funktioniert. Der Code im ListerWatch-Ziel des Samples, mit dem Sie verbunden sind, wird als Erweiterung auf dem iPhone ausgeführt und über WatchKit mit seiner Watch-Benutzeroberfläche kommuniziert.

+0

Sie könnten eine freigegebene Manager-Klasse haben, die [UIApplication sharedApplication] aufruft, was auf Watch verboten ist, aber Sie werden es nie wissen mit diesem Makro aufgerufen werden oder überschreiben möchten. – ge0rges

8

Es gibt keine WatchKit- oder App-Erweiterungszielbedingung. Sie können jedoch Ihre eigenen Zielvorgaben erstellen, die Sie auf die gleiche Weise verwenden.

Wenn Sie im Abschnitt "Buildeinstellungen" für ein Ziel suchen, gibt es einen Abschnitt namens "Andere C-Flags". Fügen Sie einen Eintrag für das WatchKit-Ziel hinzu. Wenn Sie etwas wie -DMY_WATCHKIT_FLAG=1 hinzufügen, können Sie dann #if MY_WATCHKIT_FLAG im Code tun.

Machen Sie Ihre benutzerdefinierte Flagge, gut, benutzerdefiniert. Es ist nicht unmöglich, dass Apple in Zukunft eine Flagge hinzufügen wird, die so etwas wie TARGET_WATCH_APP oder was auch immer heißt. Verwenden Sie ein Präfix für den Flagnamen, um es für Sie spezifisch zu machen.

+1

Zum Zeitpunkt der Frage hätte ich diese Antwort akzeptiert. Ich bin mir nicht sicher, warum ich das nicht getan habe. Aber wie es das Schicksal wollte, fügte Apple "TARGET_OS_WATCH" hinzu. Entschuldigen Sie die Verspätung. – jww

12

Sie alle Arten von Ziel conditionals in den TargetConditionals.h finden (cmd + shift + o und Art TargetConditionals.h).

In dieser Liste finden Sie eine Liste wie diese und viele weitere nützliche Definitionen. Momentan enthält es TARGET_OS_WATCH seit WatchOS 2.Für WatchOS 1 war es nicht möglich, benutzerdefinierten Code auf der Uhr laufen zu lassen, so dass es damals nicht benötigt wurde, da alles auf dem Telefon selbst lief.

#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 Addition

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

Einige andere gültige Werte: iOS, OSX, tvOS

Eine kleine Erklärung über dies und mehr http://nshipster.com/swift-system-version-checking/

Am Ende dieses Dokuments https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_15#Build Konfigurationen Unter der se 'Build Configurations' finden Sie eine (hoffentlich) aktuelle Liste mit all diesen Werten, die zur Zeit verfügbar sind