我正在查看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
或类似的测试。 watch
中TargetConditionals.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的手表是否有预处理器?
我正在使用ios进行标记,但我不确定这个问题的操作系统是否正确。
以下列表是从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
吗?
答案 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进行通信。