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

16

有很多解决方案可以找出我们的应用程序在哪个设备上运行。

iOS:如何在Swift中确定当前的iPhone / 设备型号?

但是在模拟器中运行时,我们只能检测到它是模拟器,但不能确定模拟器的类型(iphone5、6、6s等)。

如何根据设备类型在模拟器上测试不同的逻辑? 或者我怎样才能在代码中检测出模拟的设备是什么?

4个回答

26

根据我在这里这里找到的答案,我为您编写了这个小型 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"魔法时出现的编译警告,这里有一个更好的解决方案,以一个类的形式呈现。


在较新版本的Swift中,该调用为ProcessInfo.processInfo.environment[…] - Patrick Pijnappel

5

从 Xcode 9.4.1 开始, NSProcessInfo().environment 现在包括一个键为 "SIMULATOR_DEVICE_NAME" 的值。该值看起来像是 "iPhone 8"。


1
你也可以使用我的BDLocalizedDevicesModels框架,只需一行代码即可获取名称。在Github上查看。
它适用于Objective-C和Swift,并可帮助您获取真实设备或模拟器的设备名称。

0

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

这段代码只适用于M1芯片的Mac吗?我在Xcode 14.3.1中尝试了这段代码,但出现了错误[Type 'String' has no member 'fromCString'],出现在String.fromCString这一行。 - undefined
1
我已经更新了代码,现在应该可以正常编译了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接