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 宏的主要内容,如果未能解决你的问题,请参考以下文章

iOS滤镜 图片处理

Ios 若干兼容处理

iOS:使用 Branch.io 处理 noInternet 案例

IOS 后台不断网处理

iOS:事件处理机制

socket.io |我应该将路由处理程序包装在 io.on('connection') 中吗?