Apple Watch的预处理器宏?

时间:2015-01-07 00:44:18

标签: ios preprocessor watchkit c-preprocessor watch-os-2

我正在查看Apple的Lister (for Apple Watch, iOS, and OS X)样本。该示例对iOS和OS X执行测试:

#import <TargetConditionals.h>

#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)

@import ListerKit;

#elif TARGET_OS_MAC

@import ListerKitOSX;

#endif

但是,没有TARGET_OS_WATCH或类似的测试。 watchTargetConditionals.h的点击不会产生任何点击:

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

来自TargetConditionals.h,我知道有:

    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

问题:Apple的手表是否有预处理器?


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

以下列表是从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吗?

4 个答案:

答案 0 :(得分:20)

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

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

(另外,请注意:TARGET_OS_IPHONE在watchOS上也设置为1,但TARGET_OS_IOS为0。)

答案 1 :(得分:15)

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

在此列表中,您可以找到这样的列表以及更多有用的定义。 目前它确实包含自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 

Swift Addition

#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#Build配置 在“构建配置”部分下,您可以找到(希望)最新的列表,其中包含当前可用的所有值

答案 2 :(得分:8)

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

如果您查看&#34;构建设置&#34;对于任何目标的部分,有一个名为&#34;其他C标志&#34;的部分。添加WatchKit目标的条目。如果您添加-DMY_WATCHKIT_FLAG=1之类的内容,则可以在代码中执行#if MY_WATCHKIT_FLAG

制作自定义标志,好吧,自定义。 Apple可能会在未来添加一个标记,如TARGET_WATCH_APP或其他类似的东西,这并非不可能。在标志名称上使用前缀使其特定于您。

答案 3 :(得分:2)

使用当前的WatchKit SDK,Watch应用程序中的所有代码都在它配对的手机上运行,​​因此您的预处理器无法遇到将在Watch上运行的代码,因此没有多少用于宏告诉它该怎么办。您链接到的示例的ListerWatch目标中的代码将作为iPhone上的扩展程序运行,并通过WatchKit与其监视UI进行通信。