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 生成代码
问题:苹果手表有预处理器吗?
我正在使用 ios 进行标记,但我不确定对于这个问题来说 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' 部分下,您可以找到一个(希望如此)最新列表,其中包含当前可用的所有这些值
我正在查看 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 生成代码
问题:苹果手表有预处理器吗?
我正在使用 ios 进行标记,但我不确定对于这个问题来说 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' 部分下,您可以找到一个(希望如此)最新列表,其中包含当前可用的所有这些值