Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine the current iPhone/device model?

Is there a way to get the device model name (iPhone 4S, iPhone 5, iPhone 5S, etc) in Swift?

I know there is a property named UIDevice.currentDevice().model but it only returns device type (iPod touch, iPhone, iPad, iPhone Simulator, etc).

I also know it can be done easily in Objective-C with this method:

#import <sys/utsname.h>  struct utsname systemInfo; uname(&systemInfo);  NSString* deviceModel = [NSString stringWithCString:systemInfo.machine                           encoding:NSUTF8StringEncoding]; 

But I'm developing my iPhone app in Swift so could someone please help me with the equivalent way to solve this in Swift?

like image 750
The Mach System Avatar asked Sep 25 '14 01:09

The Mach System


People also ask

How do I find out which model iPhone I have?

Look in SettingsGo to Settings > General > About. To the right of Model, you'll see the part number. To see the model number, tap the part number.

How can I tell what model my iPhone is without turning it on?

Luckily, there is a way to find out which iPhone you have without turning it on or unlocking it by checking the Model number printed on it. The Model number starts with the letter A, as discussed in the previous chapter.

How do I find my device info on iPhone?

Go to Settings > General > About. The items you can view include: Name. iOS software version.

What is device model?

A device model is the analytical expression developed based on theoretical and experimental study. Variables and constants that make up this Analytical Expression are model parameters. In other words, device parameters are used to reproduce the actual element characteristics on a simulator.


1 Answers

I made this "pure Swift" extension on UIDevice.

This version works in Swift 2 or higher If you use an earlier version please use an older version of my answer.

If you are looking for a more elegant solution you can use my µ-framework DeviceKit published on GitHub (also available via CocoaPods, Carthage and Swift Package Manager).

Here's the code:

import UIKit  public extension UIDevice {      static let modelName: String = {         var systemInfo = utsname()         uname(&systemInfo)         let machineMirror = Mirror(reflecting: systemInfo.machine)         let identifier = machineMirror.children.reduce("") { identifier, element in             guard let value = element.value as? Int8, value != 0 else { return identifier }             return identifier + String(UnicodeScalar(UInt8(value)))         }          func mapToDevice(identifier: String) -> String { // swiftlint:disable:this cyclomatic_complexity             #if os(iOS)             switch identifier {             case "iPod5,1":                                       return "iPod touch (5th generation)"             case "iPod7,1":                                       return "iPod touch (6th generation)"             case "iPod9,1":                                       return "iPod touch (7th generation)"             case "iPhone3,1", "iPhone3,2", "iPhone3,3":           return "iPhone 4"             case "iPhone4,1":                                     return "iPhone 4s"             case "iPhone5,1", "iPhone5,2":                        return "iPhone 5"             case "iPhone5,3", "iPhone5,4":                        return "iPhone 5c"             case "iPhone6,1", "iPhone6,2":                        return "iPhone 5s"             case "iPhone7,2":                                     return "iPhone 6"             case "iPhone7,1":                                     return "iPhone 6 Plus"             case "iPhone8,1":                                     return "iPhone 6s"             case "iPhone8,2":                                     return "iPhone 6s Plus"             case "iPhone8,4":                                     return "iPhone SE"             case "iPhone9,1", "iPhone9,3":                        return "iPhone 7"             case "iPhone9,2", "iPhone9,4":                        return "iPhone 7 Plus"             case "iPhone10,1", "iPhone10,4":                      return "iPhone 8"             case "iPhone10,2", "iPhone10,5":                      return "iPhone 8 Plus"             case "iPhone10,3", "iPhone10,6":                      return "iPhone X"             case "iPhone11,2":                                    return "iPhone XS"             case "iPhone11,4", "iPhone11,6":                      return "iPhone XS Max"             case "iPhone11,8":                                    return "iPhone XR"             case "iPhone12,1":                                    return "iPhone 11"             case "iPhone12,3":                                    return "iPhone 11 Pro"             case "iPhone12,5":                                    return "iPhone 11 Pro Max"             case "iPhone12,8":                                    return "iPhone SE (2nd generation)"             case "iPhone13,1":                                    return "iPhone 12 mini"             case "iPhone13,2":                                    return "iPhone 12"             case "iPhone13,3":                                    return "iPhone 12 Pro"             case "iPhone13,4":                                    return "iPhone 12 Pro Max"             case "iPhone14,4":                                    return "iPhone 13 mini"             case "iPhone14,5":                                    return "iPhone 13"             case "iPhone14,2":                                    return "iPhone 13 Pro"             case "iPhone14,3":                                    return "iPhone 13 Pro Max"             case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":      return "iPad 2"             case "iPad3,1", "iPad3,2", "iPad3,3":                 return "iPad (3rd generation)"             case "iPad3,4", "iPad3,5", "iPad3,6":                 return "iPad (4th generation)"             case "iPad6,11", "iPad6,12":                          return "iPad (5th generation)"             case "iPad7,5", "iPad7,6":                            return "iPad (6th generation)"             case "iPad7,11", "iPad7,12":                          return "iPad (7th generation)"             case "iPad11,6", "iPad11,7":                          return "iPad (8th generation)"             case "iPad12,1", "iPad12,2":                          return "iPad (9th generation)"             case "iPad4,1", "iPad4,2", "iPad4,3":                 return "iPad Air"             case "iPad5,3", "iPad5,4":                            return "iPad Air 2"             case "iPad11,3", "iPad11,4":                          return "iPad Air (3rd generation)"             case "iPad13,1", "iPad13,2":                          return "iPad Air (4th generation)"             case "iPad2,5", "iPad2,6", "iPad2,7":                 return "iPad mini"             case "iPad4,4", "iPad4,5", "iPad4,6":                 return "iPad mini 2"             case "iPad4,7", "iPad4,8", "iPad4,9":                 return "iPad mini 3"             case "iPad5,1", "iPad5,2":                            return "iPad mini 4"             case "iPad11,1", "iPad11,2":                          return "iPad mini (5th generation)"             case "iPad14,1", "iPad14,2":                          return "iPad mini (6th generation)"             case "iPad6,3", "iPad6,4":                            return "iPad Pro (9.7-inch)"             case "iPad7,3", "iPad7,4":                            return "iPad Pro (10.5-inch)"             case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":      return "iPad Pro (11-inch) (1st generation)"             case "iPad8,9", "iPad8,10":                           return "iPad Pro (11-inch) (2nd generation)"             case "iPad13,4", "iPad13,5", "iPad13,6", "iPad13,7":  return "iPad Pro (11-inch) (3rd generation)"             case "iPad6,7", "iPad6,8":                            return "iPad Pro (12.9-inch) (1st generation)"             case "iPad7,1", "iPad7,2":                            return "iPad Pro (12.9-inch) (2nd generation)"             case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":      return "iPad Pro (12.9-inch) (3rd generation)"             case "iPad8,11", "iPad8,12":                          return "iPad Pro (12.9-inch) (4th generation)"             case "iPad13,8", "iPad13,9", "iPad13,10", "iPad13,11":return "iPad Pro (12.9-inch) (5th generation)"             case "AppleTV5,3":                                    return "Apple TV"             case "AppleTV6,2":                                    return "Apple TV 4K"             case "AudioAccessory1,1":                             return "HomePod"             case "AudioAccessory5,1":                             return "HomePod mini"             case "i386", "x86_64", "arm64":                                return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS"))"             default:                                              return identifier             }             #elseif os(tvOS)             switch identifier {             case "AppleTV5,3": return "Apple TV 4"             case "AppleTV6,2": return "Apple TV 4K"             case "i386", "x86_64": return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "tvOS"))"             default: return identifier             }             #endif         }          return mapToDevice(identifier: identifier)     }()  } 

You call it like this:

let modelName = UIDevice.modelName 

For real devices it returns e.g. "iPad Pro 9.7 Inch", for simulators it returns "Simulator " + Simulator identifier, e.g. "Simulator iPad Pro 9.7 Inch"

like image 119
HAS Avatar answered Oct 02 '22 16:10

HAS