在Objective-C中,我们可以使用宏知道应用程序是为设备还是模拟器构建的:
#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif
这些是编译时宏,在运行时不可用。
我如何在Swift中实现同样的目标?
在Objective-C中,我们可以使用宏知道应用程序是为设备还是模拟器构建的:
#if TARGET_IPHONE_SIMULATOR
// Simulator
#else
// Device
#endif
这些是编译时宏,在运行时不可用。
我如何在Swift中实现同样的目标?
当前回答
达尔文在这里描述了一切。TargetConditionals: https://github.com/apple/swift-corelibs-foundation/blob/master/CoreFoundation/Base.subproj/SwiftRuntime/TargetConditionals.h
TARGET_OS_SIMULATOR—生成的代码将在模拟器下运行
其他回答
斯威夫特4:
目前,我更喜欢使用ProcessInfo类来知道设备是否是模拟器以及正在使用的设备类型:
if let simModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
print("yes is a simulator :\(simModelCode)")
}
但是,正如您所知道的,simModelCode并不是一个容易理解的代码,因此,如果您需要,您可以尝试查看另一个so答案,以确定当前的iPhone/设备模型,并获得一个更适合人类阅读的字符串。
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
在现代系统中:
#if targetEnvironment(simulator)
// sim
#else
// device
#endif
就是这么简单。
swift 4.1已过时。请改用#if targetEnvironment(模拟器)。源
要检测Swift中的模拟器,您可以使用构建配置:
在Swift Compiler中定义此配置- d IOS_SIMULATOR - Custom Flags >其他Swift Flags 在下拉菜单中选择Any iOS Simulator SDK
现在你可以使用这个语句来检测模拟器:
#if IOS_SIMULATOR
print("It's an iOS Simulator")
#else
print("It's a device")
#endif
你也可以扩展UIDevice类:
extension UIDevice {
var isSimulator: Bool {
#if IOS_SIMULATOR
return true
#else
return false
#endif
}
}
// Example of usage: UIDevice.current.isSimulator
斯威夫特4
现在可以使用targetEnvironment(模拟器)作为参数。
#if targetEnvironment(simulator)
// Simulator
#else
// Device
#endif
为Xcode 9.3更新