'How to get the Iphone type from simulator (IOS)

There are a lot of solutions to find out on which device out app is running.

iOS: How to determine the current iPhone/device model in Swift?

But running in the simulator, we just can detect that it is the simulator, but not what type of simulator (iphone5,6,6s etc.)

How can we test different logics depending on devicetype with the simulator ? Or how can I detect which device is simulated in code ?



Solution 1:[1]

Based on the answers I found here and here, I wrote this little Swift function for you:

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)")
}

I'm getting a result of "iPhone8,2", which converts to an iPhone 6+, which is what my simulator is set to.

There's open source code available that you can use that would convert strings like "iPhone8,2" to the proper iPhone model name.

And if you want to get rid of the compiler warning for using the "DEVICE_IS_SIMULATOR" magic, here's a better solution in the form of a class.

Solution 2:[2]

As of Xcode 9.4.1, NSProcessInfo().environment now includes a key for "SIMULATOR_DEVICE_NAME". Values look like "iPhone 8".

Solution 3:[3]

You can also use my BDLocalizedDevicesModels framework to get the name in one line of code. Check it on Github.

It works with Objective-C and Swift and can help you to get the device name for real device or simulator.

Solution 4:[4]

A more up to date code that works on M1 macs too and compiles in latest 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
    }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Community
Solution 2 Jeff Gilbert
Solution 3 Benoit Deldicque
Solution 4 jcesarmobile