如何从模拟器(IOS)中获取Iphone类型



有很多解决方案可以找出运行应用程序的设备。

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"。

您还可以使用我的BDLocalizedDevicesModels框架在一行代码中获取名称。请在Github上查看。

它与Objective-C和Swift配合使用,可以帮助您获得真实设备或模拟器的设备名称。

一个更新的代码,也适用于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
    }

最新更新