21

What are all the possible values returned by [[UIDevice currentDevice] model];? It isn't documented.

Inder Kumar Rathore
  • 39,458
  • 17
  • 135
  • 184
Fergal
  • 5,213
  • 6
  • 35
  • 44

4 Answers4

42

The possible vales are iPod touch, iPhone, iPhone Simulator, iPad, iPad Simulator

If you want to know which hardware iOS is ruining on like iPhone3, iPhone4, iPhone5 etc below is the code for that


NOTE: The below code may not contain all device's string, I'm with other guys are maintaining the same code on GitHub so please take the latest code from there

Objective-C : GitHub/DeviceUtil

Swift : GitHub/DeviceGuru


#include <sys/types.h>
#include <sys/sysctl.h>

- (NSString*)hardwareDescription {
    NSString *hardware = [self hardwareString];
    if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
    if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
    if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
    if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
    if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
    if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G";
    if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G";
    if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad";
    if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini";
    if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI";
    //there are lots of other strings too, checkout the github repo
    //link is given at the top of this answer

    if ([hardware isEqualToString:@"i386"]) return @"Simulator";
    if ([hardware isEqualToString:@"x86_64"]) return @"Simulator";

    return nil;
}

- (NSString*)hardwareString {
    size_t size = 100;
    char *hw_machine = malloc(size);
    int name[] = {CTL_HW,HW_MACHINE};
    sysctl(name, 2, hw_machine, &size, NULL, 0);
    NSString *hardware = [NSString stringWithUTF8String:hw_machine];
    free(hw_machine);
    return hardware;
}
Inder Kumar Rathore
  • 39,458
  • 17
  • 135
  • 184
24

I just did a test on iPod Touch, iPhone, Phone Retina, iPhone 5, iPad, iPad Retina and iPad Mini. So this is my conclusion:

iPod touch
iPhone
iPad

On simulators - this could be useful if you're a developer working on features that sometimes do not work at all on simulators - you'll get these values:

iPhone Simulator
iPad Simulator
fredley
  • 32,953
  • 42
  • 145
  • 236
javienegas
  • 658
  • 1
  • 6
  • 12
  • Ah, the actual answer to the posted question! Thanks. I was specifically wondering if the iPad Mini would be indicated and didn't have one handy (and it's not supported in the XCode simulator), and this answered that. – BobDickinson Dec 06 '14 at 20:21
  • Anyone know the values for AppleTV? – ColdLogic Apr 05 '17 at 19:08
0

I believe the best answer to explain(something which wasn't written here) Is to say that the value itself is a String value. and the possible answers are string e.g: "iPhone","iPad" and etc..

0

None of these answers are extendable for new model numbers. Here is an enumeration:

public enum DeviceType {
 case iPad(String?)
 case iPhone(String?)
 case simulator(String?)
 case appleTV(String?)
 case unknown
}

And Extension I wrote that I think is a little cleaner and a little more extendable for when new model number come out.

extension UIDevice {
    public static func getDevice() -> DeviceType {
        var info = utsname()
        uname(&info)
        let machineMirror = Mirror(reflecting: info.machine)
        let code = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else {
                return identifier
            }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

        if code.lowercased().range(of: "ipad") != nil {
            if let range = code.lowercased().range(of: "ipad") {
                var mutate = code
                mutate.removeSubrange(range)
                return .iPad(mutate)
            }else{
                return .iPad(nil)
            }
        }else if code.lowercased().range(of: "iphone") != nil {
            if let range = code.lowercased().range(of: "iphone") {
                var mutate = code
                mutate.removeSubrange(range)
                return .iPhone(mutate)
            }else{
                return .iPhone(nil)
            }
        }else if code.lowercased().range(of: "i386") != nil || code.lowercased().range(of: "x86_64") != nil{
            return .simulator(code)
        }else if code.lowercased().range(of: "appletv") != nil {
            if let range = code.lowercased().range(of: "appletv") {
                var mutate = code
                mutate.removeSubrange(range)
                return .appleTV(mutate)
            }else{
                return .appleTV(nil)
            }
        }else{
            return .unknown
        }
    }
}
Jon Vogel
  • 5,244
  • 1
  • 39
  • 54