iOS:处理 TARGET_IPHONE_SIMULATOR 宏
Posted
技术标签:
【中文标题】iOS:处理 TARGET_IPHONE_SIMULATOR 宏【英文标题】:iOS: Handling TARGET_IPHONE_SIMULATOR macro 【发布时间】:2016-05-07 21:12:54 【问题描述】:我的环境: 在 OS X El Captain (10.11.1) 中使用 Xcode 6.4 的 ObjectiveC。在 Xcode 中,目标设置为 ios 8。
即使我选择 iPad2 作为 iOS 模拟器,TARGET_IPHONE_SIMULATOR 在下面的代码中也总是解析为 true。
#if TARGET_IPHONE_SIMULATOR
// block of code
#endif
选择 iPad2 作为 iOS 模拟器时 TARGET_IPHONE_SIMULATOR 不应该设置为 false 吗?
【问题讨论】:
顺便说一句 - 你为什么使用这样过时的 Xcode 版本? 我别无选择。如果我升级到最新的 Xcode,代码将无法编译 - 会影响一些库。 【参考方案1】:请注意,iOS 9 中引入了较新的宏以及 tvOS 和 watchOS,并且当时不推荐使用 TARGET_IPHONE_SIMULATOR 宏以避免混淆。来自 TargetConditionals.h:
TARGET_OS_WIN32 - 生成的代码将在 32 位 Windows 下运行 TARGET_OS_UNIX - 生成的代码将在某些 Unix(不是 OSX)下运行 TARGET_OS_MAC - 生成的代码将在 Mac OS X 变体下运行 TARGET_OS_IPHONE - 为固件、设备或模拟器生成的代码 TARGET_OS_IOS - 生成的代码将在 iOS 下运行 TARGET_OS_TV - 生成的代码将在 Apple TV 操作系统下运行 TARGET_OS_WATCH - 生成的代码将在 Apple Watch OS 下运行 TARGET_OS_SIMULATOR - 生成的代码将在模拟器下运行 TARGET_OS_EMBEDDED - 为固件生成的代码 TARGET_IPHONE_SIMULATOR - 已弃用:与 TARGET_OS_SIMULATOR 相同 TARGET_OS_NANO - 已弃用:与 TARGET_OS_WATCH 相同【讨论】:
【参考方案2】:该宏适用于任何模拟器构建。宏早在 iPad 出现之前就已经存在。回到“iOS”还是“iPhone OS”的时候。
所以把它想象成“TARGET_IOS_SIMULATOR”。
当您的代码中有一些内容只应在为模拟 iOS 设备构建时编译时使用。
如果您需要在 iPhone 模拟器和 iPad 模拟器之间运行不同的东西,您可能需要这样的东西:
#if TARGET_IPHONE_SIMULATOR
// This code is only for a simulator
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
// iPhone/iPod touch simulator
else
// iPad simulator
#endif
【讨论】:
【参考方案3】:对于任何使用 Swift 版本 >= 4.1 的开发人员,最好使用 #if targetEnvironment(simulator)
。参考:Target environment platform condition
代码:
extension UIDevice
static var isSimulator: Bool
#if targetEnvironment(simulator)
return true
#else
return false
#endif
【讨论】:
以上是关于iOS:处理 TARGET_IPHONE_SIMULATOR 宏的主要内容,如果未能解决你的问题,请参考以下文章