Apple Watch的预处理器宏?

jww*_*jww 12 preprocessor ios c-preprocessor watchkit watchos-2

我正在看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
Run Code Online (Sandbox Code Playgroud)

但是,没有测试TARGET_OS_WATCH或类似.Grepping for watchin TargetConditionals.h不会发出命中:

$ cat /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
  /SDKs/iPhoneOS7.1.sdk/usr/include/TargetConditionals.h | grep -i watch
$
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

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

ler*_*mjs 20

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

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

(另外,注意:TARGET_OS_IPHONEwatchOS上也设置为1,但是TARGET_OS_IOS为0.)


Sar*_*den 17

您可以在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 
Run Code Online (Sandbox Code Playgroud)

迅捷加法

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

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


Tom*_*ton 8

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

如果您查看任何目标的"构建设置"部分,则会出现一个名为"其他C标志"的部分.添加WatchKit目标的条目.如果你添加类似的东西-DMY_WATCHKIT_FLAG=1,你可以#if MY_WATCHKIT_FLAG在代码中做.

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