在Objective-C中,我们可以使用宏知道应用程序是为设备还是模拟器构建的:
#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif
这些是编译时宏,在运行时不可用。
我如何在Swift中实现同样的目标?
在Objective-C中,我们可以使用宏知道应用程序是为设备还是模拟器构建的:
#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif
这些是编译时宏,在运行时不可用。
我如何在Swift中实现同样的目标?
当前回答
TARGET_IPHONE_SIMULATOR在iOS 9中已弃用。TARGET_OS_SIMULATOR是替换。TARGET_OS_EMBEDDED也是可用的。
从targetconditions .h:
#如果定义(__GNUC__) & &(定义(__APPLE_CPP__) | |定义(__APPLE_CC__) | | (__MACOS_CLASSIC__)定义) …… #定义TARGET_OS_SIMULATOR 0 #定义TARGET_OS_EMBEDDED #定义TARGET_IPHONE_SIMULATOR TARGET_OS_SIMULATOR /* deprecated */ #定义TARGET_OS_NANO TARGET_OS_WATCH
其他回答
斯威夫特4
现在可以使用targetEnvironment(模拟器)作为参数。
#if targetEnvironment(simulator)
// Simulator
#else
// Device
#endif
为Xcode 9.3更新
在现代系统中:
#if targetEnvironment(simulator)
// sim
#else
// device
#endif
就是这么简单。
下面是一个基于HotJard上面的精彩答案的Xcode 11 Swift示例,这也添加了一个isDevice Bool,并使用SIMULATOR_UDID而不是name。变量赋值是在每一行上完成的,这样你就可以更容易地在调试器中检查它们。
import Foundation
// Extensions to UIDevice based on ProcessInfo.processInfo.environment keys
// to determine if the app is running on an actual device or the Simulator.
@objc extension UIDevice {
static var isSimulator: Bool {
let environment = ProcessInfo.processInfo.environment
let isSimulator = environment["SIMULATOR_UDID"] != nil
return isSimulator
}
static var isDevice: Bool {
let environment = ProcessInfo.processInfo.environment
let isDevice = environment["SIMULATOR_UDID"] == nil
return isDevice
}
}
还有DTPlatformName的字典条目,它应该包含模拟器。
更新信息截至2018年2月20日
看起来@russbishop有一个权威的答案,使这个答案“不正确”-即使它似乎工作了很长一段时间。
检测应用程序是否正在构建的设备或模拟器在Swift
以前的回答
基于@WZW的回答和@Pang的评论,我创建了一个简单的实用结构。这个解决方案避免了@WZW的答案产生的警告。
import Foundation
struct Platform {
static var isSimulator: Bool {
return TARGET_OS_SIMULATOR != 0
}
}
使用示例:
if Platform.isSimulator {
print("Running on Simulator")
}
从Swift 1.0开始,对我来说有用的是检查除了arm之外的架构:
#if arch(i386) || arch(x86_64)
//simulator
#else
//device
#endif