2015-01-07 91 views
10

我在看Apple的Lister (for Apple Watch, iOS, and OS X)样本。样本执行测试iOS和OS X:Apple Watch的预处理器宏?

#import <TargetConditionals.h> 

#if (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR) 

@import ListerKit; 

#elif TARGET_OS_MAC 

@import ListerKitOSX; 

#endif 

然而,没有试验TARGET_OS_WATCH或类似。 Grepping在TargetConditionals.hwatch提供没有命中:

$ 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

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


我与标记,但我不知道这是对这个问题的正确操作系统。

下面的列表是从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

回答

19

截至watchOS 2.0,可以运行在观看原生代码,所以这是一个更重要的问题。

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

(同时,应注意:TARGET_OS_IPHONE也被设置为1的watchOS,虽然TARGET_OS_IOS为0)

2

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

+0

你可以有一个共享管理器类,调用[UIApplication sharedApplication],这是禁止在手表上,但你知道永远不会被调用或可能想要使用此宏覆盖。 – ge0rges

8

没有WatchKit或应用程式额外目标条件。但是,您可以按照相同的方式创建您自己的每个目标条件。

如果你对任何目标的“生成设置”部分中找到,有一个名为“其他C标志”一节。为WatchKit目标添加一个条目。如果添加-DMY_WATCHKIT_FLAG=1之类的东西,则可以在代码中执行#if MY_WATCHKIT_FLAG

让你自定义的标志,那么,自定义。苹果可能会在未来添加一个标志,例如TARGET_WATCH_APP或其他什么,这不是不可能的。在标记名称上使用前缀以使其特定于您。

+1

在问题发生时,我应该接受这个答案。我不确定我为什么没有。但是随着命运的发展,Apple增加了'TARGET_OS_WATCH'。对不起,延迟。 – jww

12

你可以找到所有种类的靶条件句在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配置 在se ction“构建配置”,你可以找到一个(希望)最新的列表,包含当前可用的所有这些值