Determine device (iPhone, iPod Touch) with iOS

后端 未结 30 1807
礼貌的吻别
礼貌的吻别 2020-11-21 11:29

Is there a way to determine the device running an application. I want to distinguish between iPhone and iPod Touch, if possible.

30条回答
  •  走了就别回头了
    2020-11-21 12:03

    Based on the very good answers above, here is what I came up with. This is very similar to @Rodrigo's answer, but addresses @Oliver's concern from the comment on that answer. This also provides the option of including the model string in the output string.

    + (NSString *) deviceModel {
        size_t size;
        sysctlbyname("hw.machine", NULL, &size, NULL, 0);
        char *model = malloc(size);
        sysctlbyname("hw.machine", model, &size, NULL, 0);
        NSString *deviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding];
        free(model);      
    
        return deviceModel;
    }
    
    + (NSString *) deviceName {
        NSString *deviceModel = [DeviceGateway deviceModel];                    
    
        if ([deviceModel isEqual:@"i386"])      return @"Simulator";  //iPhone Simulator
        if ([deviceModel isEqual:@"iPhone1,1"]) return @"iPhone1G";   //iPhone 1G
        if ([deviceModel isEqual:@"iPhone1,2"]) return @"iPhone3G";   //iPhone 3G
        if ([deviceModel isEqual:@"iPhone2,1"]) return @"iPhone3GS";  //iPhone 3GS
        if ([deviceModel isEqual:@"iPhone3,1"]) return @"iPhone4";    //iPhone 4 - AT&T
        if ([deviceModel isEqual:@"iPhone3,2"]) return @"iPhone4";    //iPhone 4 - Other carrier
        if ([deviceModel isEqual:@"iPhone3,3"]) return @"iPhone4";    //iPhone 4 - Other carrier
        if ([deviceModel isEqual:@"iPhone4,1"]) return @"iPhone4S";   //iPhone 4S
        if ([deviceModel isEqual:@"iPod1,1"])   return @"iPod1stGen"; //iPod Touch 1G
        if ([deviceModel isEqual:@"iPod2,1"])   return @"iPod2ndGen"; //iPod Touch 2G
        if ([deviceModel isEqual:@"iPod3,1"])   return @"iPod3rdGen"; //iPod Touch 3G
        if ([deviceModel isEqual:@"iPod4,1"])   return @"iPod4thGen"; //iPod Touch 4G
        if ([deviceModel isEqual:@"iPad1,1"])   return @"iPadWiFi";   //iPad Wifi
        if ([deviceModel isEqual:@"iPad1,2"])   return @"iPad3G";     //iPad 3G
        if ([deviceModel isEqual:@"iPad2,1"])   return @"iPad2";      //iPad 2 (WiFi)
        if ([deviceModel isEqual:@"iPad2,2"])   return @"iPad2";      //iPad 2 (GSM)
        if ([deviceModel isEqual:@"iPad2,3"])   return @"iPad2";      //iPad 2 (CDMA)
    
        NSString *aux = [[deviceModel componentsSeparatedByString:@","] objectAtIndex:0];
    
        //If a newer version exists
        if ([aux rangeOfString:@"iPhone"].location != NSNotFound) {
            int version = [[aux stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] intValue];
            if (version == 3) return @"iPhone4";
            if (version == 4) return @"iPhone4s";
            return @"Newer iPhone";
        }
        if ([aux rangeOfString:@"iPod"].location != NSNotFound) {
            int version = [[aux stringByReplacingOccurrencesOfString:@"iPod" withString:@""] intValue];
            if (version == 4) return @"iPod4thGen";
            return @"Newer iPod";
        }
        if ([aux rangeOfString:@"iPad"].location != NSNotFound) {
            int version = [[aux stringByReplacingOccurrencesOfString:@"iPad" withString:@""] intValue];
            if (version == 1) return @"iPad3G";
            if (version == 2) return @"iPad2";
            return @"Newer iPad";
        }
    
        //If none was found, send the original string
        return deviceModel;
    }
    
    + (NSString *) deviceNameWithDeviceModel:(BOOL)shouldIncludeDeviceModel {
        if (shouldIncludeDeviceModel) {
            return [NSString stringWithFormat:@"%@ (%@)", [DeviceGateway deviceName], [DeviceGateway deviceModel]];
        }
    
        return [DeviceGateway deviceName];
    }
    

提交回复
热议问题