Apple Watch 的预处理器宏?

Preprocessor macro for Apple Watch?

我正在查看 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 或类似内容没有测试。在 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 - 生成代码将 运行 在嵌入的 OS 变体下
                                  TARGET_OS_MAC
        TARGET_OS_IPHONE - 生成代码将 运行 在 iPhone OS 下
                                  是 TARGET_OS_MAC 的变体。
    TARGET_IPHONE_SIMULATOR - 在 iPhone 模拟器 
下为 运行ning 生成代码

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


我正在使用 进行标记,但我不确定对于这个问题来说 OS 是否正确。

下面的列表是根据 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?

使用当前的 WatchKit SDK,phone 上的 Watch 应用程序 运行 中的所有代码都与之配对,因此您的预处理器不会遇到将要执行的代码运行 在 Watch 上,因此宏没有多大用处来告诉它该做什么。您链接到的示例的 ListerWatch 目标中的代码将 运行 作为 iPhone 的扩展,并通过 WatchKit 与其手表 UI 对话。

没有条件性的 WatchKit 或应用扩展目标。但是您可以创建自己的按目标条件,以相同的方式使用。

如果您查看任何目标的 "Build Settings" 部分,会发现有一个名为 "Other C Flags" 的部分。为 WatchKit 目标添加一个条目。如果您添加 -DMY_WATCHKIT_FLAG=1 之类的内容,则可以在代码中执行 #if MY_WATCHKIT_FLAG

制作您的自定义标志,嗯,自定义。 Apple 在未来可能会添加一个名为 TARGET_WATCH_APP 或其他名称的标志并非不可能。在标志名称上使用前缀使其特定于您。

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

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

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

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

在此列表中,您可以找到类似的列表以及更多有用的定义。 目前它确实包含自 WatchOS 2 以来的 TARGET_OS_WATCH。对于 WatchOS 1,无法 运行 在手表上自定义代码,因此当时不需要它,因为 运行 在 [=34] =]本身。

#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加法

#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 配置 在 'Build Configurations' 部分下,您可以找到一个(希望如此)最新列表,其中包含当前可用的所有这些值