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
没有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交谈。