有很多解决方案可以找出我们的应用程序在哪个设备上运行。
iOS:如何在Swift中确定当前的iPhone / 设备型号?
但是在模拟器中运行时,我们只能检测到它是模拟器,但不能确定模拟器的类型(iphone5、6、6s等)。
如何根据设备类型在模拟器上测试不同的逻辑? 或者我怎样才能在代码中检测出模拟的设备是什么?
有很多解决方案可以找出我们的应用程序在哪个设备上运行。
iOS:如何在Swift中确定当前的iPhone / 设备型号?
但是在模拟器中运行时,我们只能检测到它是模拟器,但不能确定模拟器的类型(iphone5、6、6s等)。
如何根据设备类型在模拟器上测试不同的逻辑? 或者我怎样才能在代码中检测出模拟的设备是什么?
根据我在这里和这里找到的答案,我为您编写了这个小型 Swift 函数:
func getPlatformNSString() {
#if (arch(i386) || arch(x86_64)) && os(iOS)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
var machineSwiftString : String = ""
if DEVICE_IS_SIMULATOR == true
{
// this neat trick is found at http://kelan.io/2015/easier-getenv-in-swift/
if let dir = NSProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
machineSwiftString = dir
}
} else {
var size : size_t = 0
sysctlbyname("hw.machine", nil, &size, nil, 0)
var machine = [CChar](count: Int(size), repeatedValue: 0)
sysctlbyname("hw.machine", &machine, &size, nil, 0)
machineSwiftString = String.fromCString(machine)!
}
print("machine is \(machineSwiftString)")
}
我得到了一个"iPhone8,2"的结果,它转换成了iPhone 6+,这也是我的模拟器设置的。
有开源代码可用,可以将类似"iPhone8,2
"的字符串转换为正确的iPhone型号名称。
如果你想要消除使用"DEVICE_IS_SIMULATOR
"魔法时出现的编译警告,这里有一个更好的解决方案,以一个类的形式呈现。
从 Xcode 9.4.1 开始, NSProcessInfo().environment 现在包括一个键为 "SIMULATOR_DEVICE_NAME" 的值。该值看起来像是 "iPhone 8"。
更加更新的代码,适用于M1 Mac,并且可以在最新的Swift中编译
public func getModelName() -> String {
var machineSwiftString : String = ""
#if targetEnvironment(simulator)
if let dir = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
machineSwiftString = dir
}
#else
var size : size_t = 0
sysctlbyname("hw.machine", nil, &size, nil, 0)
var machine = [CChar](count: Int(size), repeatedValue: 0)
sysctlbyname("hw.machine", &machine, &size, nil, 0)
machineSwiftString = String.fromCString(machine)!
#endif
return machineSwiftString
}
Type 'String' has no member 'fromCString'
],出现在String.fromCString
这一行。 - undefined
ProcessInfo.processInfo.environment[…]
。 - Patrick Pijnappel