Apple Watch的预处理器macros?

我正在研究苹果的李斯特(苹果手表,iOS和OS X)示例。 该示例对iOS和OS X执行testing:

#import <TargetConditionals.h> #if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) @import ListerKit; #elif TARGET_OS_MAC @import ListerKitOSX; #endif 

但是,没有对TARGET_OS_WATCH或类似的testing。 在TargetConditionals.h清理watch不会造成任何影响:

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

TargetConditionals.h ,我知道有:

 这些条件指定生成的代码将在哪个操作系统中执行
    跑。  MAC / WIN32 / UNIX条件是相互排斥的。  EMBEDDED / IPHONE 
    条件是TARGET_OS_MAC的变体。 

         TARGET_OS_MAC  - 生成代码将在Mac OS下运行
         TARGET_OS_WIN32  - 生成的代码将在32位Windows下运行
         TARGET_OS_UNIX  - 生成代码将在一些非Mac OS X unix下运行 
         TARGET_OS_EMBEDDED  - 生成代码将在embedded式操作系统变体下运行
                                  的TARGET_OS_MAC
         TARGET_OS_IPHONE  - 生成代码将在iPhone OS下运行 
                                  是TARGET_OS_MAC的变体。
     TARGET_IPHONE_SIMULATOR  - 生成在iPhone模拟器下运行的代码 

问题 :苹果手表是否有预处理器?


我用ios标记,但我不确定这是否是这个问题的正确的操作系统。

下面的列表是从iPhone的TargetConditionals.h编译的。 模拟器和OS X是相似的(它们只是将不同的位设置为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 

问题 :手表是否使用TARGET_OS_EMBEDDED ? 手表是否省略了 TARGET_OS_IPHONE

从watchOS 2.0开始,你可以在手表上运行本地代码,所以这是一个更相关的问题。

我正在使用watchOS 2的第一个早期testing版,所以这可能会改变,但现在,watchOS上的TARGET_OS_WATCH被设置为1。

(另外,注意:watchOS上的TARGET_OS_IPHONE也设置为1,尽pipeTARGET_OS_IOS为0.)

您可以在TargetConditionals.h(cmd + shift + o并键入TargetConditionals.h)中find所有types的目标条件。

在这个列表中,你可以find像这样的列表和更多有用的定义。 目前它包含自WatchOS 2以来的TARGET_OS_WATCH。对于WatchOS 1,不可能在手表上运行自定义代码,所以当时并不需要手机自身的所有代码。

 #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 

迅速增加

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

其他一些有效的值:iOS,OSX,tvOS

关于这个和更多的http://nshipster.com/swift-system-version-checking/

在这个文档的底部https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_15#Buildconfiguration下的部分“构buildconfiguration”,你可以find一个(希望)最新的列表,所有这些当前可用的&#x503C;

没有WatchKit或应用程序扩展目标条件。 但是,您可以按照相同的方式创build您自己的每个目标条件。

如果你在任何目标的“构build设置”部分看,有一个名为“其他C标志”部分。 为WatchKit目标添加一个条目。 如果添加-DMY_WATCHKIT_FLAG=1类的东西,则可以在代码中执行#if MY_WATCHKIT_FLAG

制作自定义标志,自定义。 苹果可能会在未来添加一个标志,例如TARGET_WATCH_APP或其他东西,这不是不可能的。 在标志名称上使用一个前缀,使其具体到你。

使用当前的WatchKit SDK,Watch应用程序中的所有代码都可以在与其配对的手机上运行,​​因此,预处理器将遇到将要在Watch上运行的代码,因此没有多大用处,它什么时候做什么。 您链接的示例的ListerWatch目标中的代码将在iPhone上作为扩展运行,并通过WatchKit与其Watch UI交谈。