How to programmatically differentiate between iphone 4 and iphone 4S?

后端 未结 7 1569
醉酒成梦
醉酒成梦 2020-11-29 18:08

I am working on app which needs to check the iphone model, but I\'m not able to find any solution. I will be thank full for any suggestion.

相关标签:
7条回答
  • 2020-11-29 18:48

    For my purposes I've written a tiny library that abstracts away the underlying C calls and presents an Objective-C interface.

    NSLog(@"Big model number: %d", deviceDetails.bigModel);
    //Big model number: 4
    
    NSLog(@"Small model number: %d", deviceDetails.smallModel);
    //Small model number: 1
    
    if (deviceDetails.model == GBDeviceModeliPhone4S) {
        NSLog(@"It's a 4S");
    }
    //It's a 4S
    
    if (deviceDetails.family != GBDeviceFamilyiPad) {
        NSLog(@"It's not an iPad");
    }
    //It's not an iPad
    
    NSLog(@"systemInfo string: %@", [GBDeviceInfo rawSystemInfoString]);
    //systemInfo string: iPhone4,1
    

    It's on github: GBDeviceInfo

    0 讨论(0)
  • 2020-11-29 18:48

    Try using following : you will get all the detail informations of the Device...

    NSLog(@"uniqueIdentifier: %@", [[UIDevice currentDevice] uniqueIdentifier]);
    NSLog(@"name: %@", [[UIDevice currentDevice] name]);
    NSLog(@"systemName: %@", [[UIDevice currentDevice] systemName]);
    NSLog(@"systemVersion: %@", [[UIDevice currentDevice] systemVersion]);
    NSLog(@"model: %@", [[UIDevice currentDevice] model]);
    NSLog(@"localizedModel: %@", [[UIDevice currentDevice] localizedModel]);
    

    If above does not work for you then use github project

    EDIT :

    Whether you are on an iPhone or a iPod Touch:

    UIDevice *device = [UIDevice currentDevice];
    NSString *systemName = [device systemName];
    

    To detect the version of the OS:

    UIDevice *device = [UIDevice currentDevice];
    NSString *systemVersion = [device systemVersion];
    

    For Reference: how do I detect whether I have iPhone 2G,3G,3GS

    0 讨论(0)
  • 2020-11-29 18:49

    This is much simpler one. SIMPLE ENOUGH FOR JUST COPY & PASTE

    Also, I've included matching model name for machine name.

    //MARK: Required import
    #import <sys/utsname.h>
    
    + (NSString*)deviceModelName {
    
        struct utsname systemInfo;
        uname(&systemInfo);
    
        NSString *machineName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
        //MARK: More official list is at
        //http://theiphonewiki.com/wiki/Models
        //MARK: You may just return machineName. Following is for convenience
    
        NSDictionary *commonNamesDictionary =
        @{
          @"i386":     @"iPhone Simulator",
       @"x86_64":   @"iPad Simulator",
    
       @"iPhone1,1":    @"iPhone",
       @"iPhone1,2":    @"iPhone 3G",
       @"iPhone2,1":    @"iPhone 3GS",
       @"iPhone3,1":    @"iPhone 4",
       @"iPhone3,2":    @"iPhone 4(Rev A)",
       @"iPhone3,3":    @"iPhone 4(CDMA)",
       @"iPhone4,1":    @"iPhone 4S",
       @"iPhone5,1":    @"iPhone 5(GSM)",
       @"iPhone5,2":    @"iPhone 5(GSM+CDMA)",
       @"iPhone5,3":    @"iPhone 5c(GSM)",
       @"iPhone5,4":    @"iPhone 5c(GSM+CDMA)",
       @"iPhone6,1":    @"iPhone 5s(GSM)",
       @"iPhone6,2":    @"iPhone 5s(GSM+CDMA)",
    
       @"iPhone7,1":    @"iPhone 6+ (GSM+CDMA)",
       @"iPhone7,2":    @"iPhone 6 (GSM+CDMA)",
    
       @"iPhone8,1":    @"iPhone 6S (GSM+CDMA)",
       @"iPhone8,2":    @"iPhone 6S+ (GSM+CDMA)",
    
       @"iPad1,1":  @"iPad",
       @"iPad2,1":  @"iPad 2(WiFi)",
       @"iPad2,2":  @"iPad 2(GSM)",
       @"iPad2,3":  @"iPad 2(CDMA)",
       @"iPad2,4":  @"iPad 2(WiFi Rev A)",
       @"iPad2,5":  @"iPad Mini 1G (WiFi)",
       @"iPad2,6":  @"iPad Mini 1G (GSM)",
       @"iPad2,7":  @"iPad Mini 1G (GSM+CDMA)",
       @"iPad3,1":  @"iPad 3(WiFi)",
       @"iPad3,2":  @"iPad 3(GSM+CDMA)",
       @"iPad3,3":  @"iPad 3(GSM)",
       @"iPad3,4":  @"iPad 4(WiFi)",
       @"iPad3,5":  @"iPad 4(GSM)",
       @"iPad3,6":  @"iPad 4(GSM+CDMA)",
    
       @"iPad4,1":  @"iPad Air(WiFi)",
       @"iPad4,2":  @"iPad Air(GSM)",
       @"iPad4,3":  @"iPad Air(GSM+CDMA)",
    
       @"iPad5,3":  @"iPad Air 2 (WiFi)",
       @"iPad5,4":  @"iPad Air 2 (GSM+CDMA)",
    
       @"iPad4,4":  @"iPad Mini 2G (WiFi)",
       @"iPad4,5":  @"iPad Mini 2G (GSM)",
       @"iPad4,6":  @"iPad Mini 2G (GSM+CDMA)",
    
       @"iPad4,7":  @"iPad Mini 3G (WiFi)",
       @"iPad4,8":  @"iPad Mini 3G (GSM)",
       @"iPad4,9":  @"iPad Mini 3G (GSM+CDMA)",
    
       @"iPod1,1":  @"iPod 1st Gen",
       @"iPod2,1":  @"iPod 2nd Gen",
       @"iPod3,1":  @"iPod 3rd Gen",
       @"iPod4,1":  @"iPod 4th Gen",
       @"iPod5,1":  @"iPod 5th Gen",
       @"iPod7,1":  @"iPod 6th Gen",
        };
    
        NSString *deviceName = commonNamesDictionary[machineName];
    
        if (deviceName == nil) {
            deviceName = machineName;
        }
    
        return deviceName;
    }
    
    0 讨论(0)
  • 2020-11-29 18:52

    Here is a common method of retriving the device model. There are no NS methods for this, so you gotta use c

    #include <sys/types.h>
    #include <sys/sysctl.h>
    
    - (NSString *)machine {
        NSString *machine;
        size_t size;
        sysctlbyname("hw.machine", NULL, &size, NULL, 0);
        char *name = malloc(size);
        sysctlbyname("hw.machine", name, &size, NULL, 0);
        machine = [NSString stringWithUTF8String:name];
        free(name);
        return machine;
    }
    
    0 讨论(0)
  • 2020-11-29 19:09
    Update a list of devices: 
    In future will be updated with iPad 4.
    +  (NSString*)deviceModelName {
    /*
     @"i386"      on the simulator
     @"x86_64"    on the simulator
     @"iPod1,1"   on iPod Touch
     @"iPod2,1"   on iPod Touch Second Generation
     @"iPod3,1"   on iPod Touch Third Generation
     @"iPod4,1"   on iPod Touch Fourth Generation
     @"iPod5,1"   on iPod Touch Fourth Generation
     @"iPhone1,1" on iPhone
     @"iPhone1,2" on iPhone 3G
     @"iPhone2,1" on iPhone 3GS
     @"iPad1,1"   on iPad
     @"iPad2,1"   on iPad 2
     @"iPad2,5"   on iPad mini 1
     @"iPad3,1"   on iPad 3
     @"iPhone3,1" on iPhone 4
     @"iPhone4,1" on iPhone 4S
     @"iPhone5,1" on iPhone 5
     */
    
    struct utsname systemInfo;
    
    uname(&systemInfo);
    
    NSString *modelName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
    if([modelName isEqualToString:@"i386"] || [modelName isEqualToString:@"x86_64"]) {
        modelName = @"iPhone Simulator";
    }
    else if([modelName isEqualToString:@"iPhone1,1"]) {
        modelName = @"iPhone";
    }
    else if([modelName isEqualToString:@"iPhone1,2"]) {
        modelName = @"iPhone 3G";
    }
    else if([modelName isEqualToString:@"iPhone2,1"]) {
        modelName = @"iPhone 3GS";
    }
    else if([modelName isEqualToString:@"iPhone3,1"]) {
        modelName = @"iPhone 4";
    }
    else if([modelName isEqualToString:@"iPhone4,1"]) {
        modelName = @"iPhone 4S";
    }
    else if([modelName isEqualToString:@"iPhone5,1"]) {
        modelName = @"iPhone 5";
    }
    else if([modelName isEqualToString:@"iPod1,1"]) {
        modelName = @"iPod 1st Gen";
    }
    else if([modelName isEqualToString:@"iPod2,1"]) {
        modelName = @"iPod 2nd Gen";
    }
    else if([modelName isEqualToString:@"iPod3,1"]) {
        modelName = @"iPod 3rd Gen";
    }
    else if([modelName isEqualToString:@"iPod4,1"]) {
        modelName = @"iPod 4th Gen";
    }
    else if([modelName isEqualToString:@"iPod5,1"]) {
        modelName = @"iPod 5th Gen";
    }
    else if([modelName isEqualToString:@"iPad1,1"]) {
        modelName = @"iPad";
    }
    else if([modelName isEqualToString:@"iPad2,1"]) {
        modelName = @"iPad 2(WiFi)";
    }
    else if([modelName isEqualToString:@"iPad2,2"]) {
        modelName = @"iPad 2(GSM)";
    }
    else if([modelName isEqualToString:@"iPad2,3"]) {
        modelName = @"iPad 2(CDMA)";
    }
    else if([modelName isEqualToString:@"iPad2,4"]) {
        modelName = @"iPad 2(WiFi + New Chip)";
    }
    else if([modelName isEqualToString:@"iPad2,5"]) {
        modelName = @"iPad mini (WiFi)";
    }
    else if([modelName isEqualToString:@"iPad2,6"]) {
        modelName = @"iPad mini (GSM)";
    }
    else if([modelName isEqualToString:@"iPad3,1"]) {
        modelName = @"iPad 3(WiFi)";
    }
    else if([modelName isEqualToString:@"iPad3,2"]) {
        modelName = @"iPad 3(GSM)";
    }
    else if([modelName isEqualToString:@"iPad3,3"]) {
        modelName = @"iPad 3(CDMA)";
    }
    
    return modelName;
    

    }

    0 讨论(0)
  • 2020-11-29 19:09

    However if you are running application on simulator, you will never get device name as "iPhone 6" of "iPhone6+" or anything like that. I am currently using Xcode Version 6.2 (6C131e) in which I have successfully checked device type even on simulator using few macros. Those are

    // ******************* DEVICE INDENTIFICATION MACROS *****************//
    #define IS_IPAD             (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    #define IS_IPHONE           (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    #define IS_IPHONE4          (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0f)
    #define IS_IPHONE5          (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
    #define IS_IPHONE6          (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
    #define IS_IPHONE6PLUS      (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
    #define IS_RETINA           ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))
    
    0 讨论(0)
提交回复
热议问题