13

我正在查看 Apple 的Lister(用于 Apple Watch、iOS 和 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或类似的测试。Grepping for watchinTargetConditionals.h没有命中:

$ 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 条件是互斥的。嵌入式/iPhone
    条件是 TARGET_OS_MAC 的变体。

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

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


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

下面的列表是从 iPhone 的TargetConditionals.h. Simulator 和 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

4 回答 4

24

您可以在 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 

快速加法

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

于 2016-03-30T13:47:25.813 回答
20

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

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

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

于 2015-06-11T18:47:50.137 回答
8

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

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

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

于 2015-01-07T03:55:04.223 回答
2

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

于 2015-01-07T02:12:06.750 回答