-
-
Save Jaybles/1323251 to your computer and use it in GitHub Desktop.
// | |
// UIDeviceHardware.h | |
// | |
// Used to determine EXACT version of device software is running on. | |
#import <Foundation/Foundation.h> | |
@interface UIDeviceHardware : NSObject | |
- (NSString *) platform; | |
- (NSString *) platformString; | |
@end |
// | |
// UIDeviceHardware.m | |
// | |
// Used to determine EXACT version of device software is running on. | |
#import "UIDeviceHardware.h" | |
#include <sys/types.h> | |
#include <sys/sysctl.h> | |
@implementation UIDeviceHardware | |
- (NSString *) platform{ | |
size_t size; | |
sysctlbyname("hw.machine", NULL, &size, NULL, 0); | |
char *machine = malloc(size); | |
sysctlbyname("hw.machine", machine, &size, NULL, 0); | |
NSString *platform = [NSString stringWithUTF8String:machine]; | |
free(machine); | |
return platform; | |
} | |
- (NSString *) platformString{ | |
NSString *platform = [self platform]; | |
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 1G"; | |
if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; | |
if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; | |
if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; | |
if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon iPhone 4"; | |
if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; | |
if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G"; | |
if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G"; | |
if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G"; | |
if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G"; | |
if ([platform isEqualToString:@"iPad1,1"]) return @"iPad"; | |
if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)"; | |
if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)"; | |
if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)"; | |
if ([platform isEqualToString:@"i386"]) return @"Simulator"; | |
if ([platform isEqualToString:@"x86_64"]) return @"Simulator"; | |
return platform; | |
} | |
@end |
UIDeviceHardware *h=[[UIDeviceHardware alloc] init]; | |
[self setDeviceModel:[h platformString]]; | |
[h release]; |
Why isn't this a pod ?
@jeremieweldin, Where did you see "GSM+CDMA" on that page? I used https://ipsw.me and created this list instead:
/* iPhone */
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4 (GSM)";
if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4 (GSM/2012)";
if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4 (CDMA)";
if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (GSM)";
if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (Global)";
if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)";
if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (Global)";
if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)";
if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (Global)";
if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
if ([platform isEqualToString:@"iPhone8,4"]) return @"iPhone SE";
if ([platform isEqualToString:@"iPhone9,1"]) return @"iPhone 7 (Global)";
if ([platform isEqualToString:@"iPhone9,3"]) return @"iPhone 7 (GSM)";
if ([platform isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus (Global)";
if ([platform isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus (GSM)";
/* iPad */
if ([platform isEqualToString:@"iPad1,1"]) return @"iPad 1";
if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)";
if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
if ([platform isEqualToString:@"iPad2,4"]) return @"iPad 2 (Mid 2012)";
if ([platform isEqualToString:@"iPad3,1"]) return @"iPad 3 (WiFi)";
if ([platform isEqualToString:@"iPad3,2"]) return @"iPad 3 (CDMA)";
if ([platform isEqualToString:@"iPad3,3"]) return @"iPad 3 (GSM)";
if ([platform isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)";
if ([platform isEqualToString:@"iPad3,5"]) return @"iPad 4 (GSM)";
if ([platform isEqualToString:@"iPad3,6"]) return @"iPad 4 (Global)";
/* iPad Air */
if ([platform isEqualToString:@"iPad4,1"]) return @"iPad Air (WiFi)";
if ([platform isEqualToString:@"iPad4,2"]) return @"iPad Air (Cellular)";
if ([platform isEqualToString:@"iPad4,3"]) return @"iPad Air (China)";
if ([platform isEqualToString:@"iPad5,3"]) return @"iPad Air 2 (WiFi)";
if ([platform isEqualToString:@"iPad5,4"]) return @"iPad Air 2 (Cellular)";
/* iPad Mini */
if ([platform isEqualToString:@"iPad2,5"]) return @"iPad Mini (WiFi)";
if ([platform isEqualToString:@"iPad2,6"]) return @"iPad Mini (GSM)";
if ([platform isEqualToString:@"iPad2,7"]) return @"iPad Mini (Global)";
if ([platform isEqualToString:@"iPad4,4"]) return @"iPad Mini 2 (WiFi)";
if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini 2 (Cellular)";
if ([platform isEqualToString:@"iPad4,6"]) return @"iPad Mini 2 (China)";
if ([platform isEqualToString:@"iPad4,7"]) return @"iPad Mini 3 (WiFi)";
if ([platform isEqualToString:@"iPad4,8"]) return @"iPad Mini 3 (Cellular)";
if ([platform isEqualToString:@"iPad4,9"]) return @"iPad Mini 3 (China)";
if ([platform isEqualToString:@"iPad5,1"]) return @"iPad Mini 4 (WiFi)";
if ([platform isEqualToString:@"iPad5,2"]) return @"iPad Mini 4 (Cellular)";
/* iPad Pro */
if ([platform isEqualToString:@"iPad6,3"]) return @"iPad Pro (9.7 inch/WiFi)";
if ([platform isEqualToString:@"iPad6,4"]) return @"iPad Pro (9.7 inch/Cellular)";
if ([platform isEqualToString:@"iPad6,7"]) return @"iPad Pro (12.9 inch/WiFi)";
if ([platform isEqualToString:@"iPad6,8"]) return @"iPad Pro (12.9 inch/Cellular)";
/* iPod */
if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
if ([platform isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G";
if ([platform isEqualToString:@"iPod7,1"]) return @"iPod Touch 6G";
/* Simulator */
if ([platform isEqualToString:@"i386"]) return @"Simulator";
if ([platform isEqualToString:@"x86_64"]) return @"Simulator";
It also contains the 9.7 inch iPad Pro models.
I performed some benchmarks, to test class methods vs instantiation and to check out @mattdipasquale comment re sysctl
.
I used various implementations of my category. You can see I've added a few more methods to return a bit more info.
My benchmarking code was:
extern uint64_t dispatch_benchmark(size_t count, void (^block)(void));
size_t const iterations = 10000;
uint64_t tt = dispatch_benchmark(iterations, ^{
@autoreleasepool {
HKWUIDeviceHardware *h=[[HKWUIDeviceHardware alloc] init];
_deviceType = [h platformString];
_isIpadOneOrTwo = [h isIpadOneOrTwo];
_isSexSeven = [h isSixOrSeven];
_isPlus = [h isPlus];
}
});
NSLog(@"HKWUIDeviceHardware Avg. Runtime: %llu ns", tt);
Results - Simulator
Test | Avg. Runtime (ns) |
---|---|
This gist | 36580 |
This gist with sysctl | 26186 |
Class methods | 36338 |
Class methods with sysctl | 25836 |
My version | 9876 |
Results - iPhone 7
Test | Avg. Runtime (ns) |
---|---|
This gist | 18210 |
This gist with sysctl | 17438 |
Class methods | 25550 |
Class methods with sysctl | 21496 |
My version | 4563 |
Now, my implementations of the class method version may not have totally optimised, but they didn't have my extra methods either.
Taking the initial implementation vs my implementation:
Simulator: 36580/9876 = 3.70x
faster
iPhone 7: 18210/4563 = 3.99x
faster
The faster implementation (if your machine name length is limited) is this, which saves a heap allocation and caches the result.
static NSString *platform;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
int key[] = { CTL_HW, HW_MACHINE };
static size_t const maxSize = 32;
size_t size = maxSize;
char machine[maxSize];
__unused int result = sysctl(key, 2, machine, &size, NULL, 0);
NSAssert(result == noErr, @"Failed to get platform name. Error: %s", strerror(result));
platform = @(machine);
});
return platform;
The updated list used in my game, add iPhone 8, iPhone X, iPad Pro 11 and more devices.
If any more devices Apple publishes, just check this link:
https://www.theiphonewiki.com/wiki/Models
if ([platform isEqualToString:@"iPhone1,1"]) return "iPhone 2G";
if ([platform isEqualToString:@"iPhone1,2"]) return "iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"]) return "iPhone 3GS";
if ([platform isEqualToString:@"iPhone3,1"]) return "iPhone 4";
if ([platform isEqualToString:@"iPhone3,2"]) return "iPhone 4";
if ([platform isEqualToString:@"iPhone3,3"]) return "iPhone 4 (CDMA)";
if ([platform isEqualToString:@"iPhone4,1"]) return "iPhone 4S";
if ([platform isEqualToString:@"iPhone5,1"]) return "iPhone 5";
if ([platform isEqualToString:@"iPhone5,2"]) return "iPhone 5 (GSM+CDMA)";
if ([platform isEqualToString:@"iPhone5,3"]) return "iPhone 5c (GSM)";
if ([platform isEqualToString:@"iPhone5,4"]) return "iPhone 5c (GSM+CDMA)";
if ([platform isEqualToString:@"iPhone6,1"]) return "iPhone 5s (GSM)";
if ([platform isEqualToString:@"iPhone6,2"]) return "iPhone 5s (GSM+CDMA)";
if ([platform isEqualToString:@"iPhone7,1"]) return "iPhone 6 Plus";
if ([platform isEqualToString:@"iPhone7,2"]) return "iPhone 6";
if ([platform isEqualToString:@"iPhone8,1"]) return "iPhone 6s Plus";
if ([platform isEqualToString:@"iPhone8,2"]) return "iPhone 6s";
if ([platform isEqualToString:@"iPhone9,1"]) return "iPhone 7";
if ([platform isEqualToString:@"iPhone9,2"]) return "iPhone 7 Plus";
if ([platform isEqualToString:@"iPhone9,3"]) return "iPhone 7";
if ([platform isEqualToString:@"iPhone9,4"]) return "iPhone 7 Plus";
if ([platform isEqualToString:@"iPhone8,4"]) return "iPhone SE";
if ([platform isEqualToString:@"iPhone10,1"] ||
[platform isEqualToString:@"iPhone10,4"]) return "iPhone 8";
if ([platform isEqualToString:@"iPhone10,2"] ||
[platform isEqualToString:@"iPhone10,5"]) return "iPhone 8 Plus";
if ([platform isEqualToString:@"iPhone10,3"] ||
[platform isEqualToString:@"iPhone10,6"]) return "iPhone X";
if ([platform isEqualToString:@"iPhone11,2"]) return "iPhone XS";
if ([platform isEqualToString:@"iPhone11,4"] ||
[platform isEqualToString:@"iPhone11,6"]) return "iPhone XS Max";
if ([platform isEqualToString:@"iPhone11,8"]) return "iPhone XR";
if ([platform isEqualToString:@"iPod1,1"]) return "iPod Touch (1 Gen)";
if ([platform isEqualToString:@"iPod2,1"]) return "iPod Touch (2 Gen)";
if ([platform isEqualToString:@"iPod3,1"]) return "iPod Touch (3 Gen)";
if ([platform isEqualToString:@"iPod4,1"]) return "iPod Touch (4 Gen)";
if ([platform isEqualToString:@"iPod5,1"]) return "iPod Touch (5 Gen)";
if ([platform isEqualToString:@"iPad1,1"]) return "iPad";
if ([platform isEqualToString:@"iPad1,2"]) return "iPad 3G";
if ([platform isEqualToString:@"iPad2,1"]) return "iPad 2 (WiFi)";
if ([platform isEqualToString:@"iPad2,2"]) return "iPad 2";
if ([platform isEqualToString:@"iPad2,3"]) return "iPad 2 (CDMA)";
if ([platform isEqualToString:@"iPad2,4"]) return "iPad 2";
if ([platform isEqualToString:@"iPad2,5"]) return "iPad Mini (WiFi)";
if ([platform isEqualToString:@"iPad2,6"]) return "iPad Mini";
if ([platform isEqualToString:@"iPad2,7"]) return "iPad Mini (GSM+CDMA)";
if ([platform isEqualToString:@"iPad3,1"]) return "iPad 3 (WiFi)";
if ([platform isEqualToString:@"iPad3,2"]) return "iPad 3 (GSM+CDMA)";
if ([platform isEqualToString:@"iPad3,3"]) return "iPad 3";
if ([platform isEqualToString:@"iPad3,4"]) return "iPad 4 (WiFi)";
if ([platform isEqualToString:@"iPad3,5"]) return "iPad 4";
if ([platform isEqualToString:@"iPad3,6"]) return "iPad 4 (GSM+CDMA)";
if ([platform isEqualToString:@"iPad4,1"]) return "iPad Air (WiFi)";
if ([platform isEqualToString:@"iPad4,2"]) return "iPad Air (Cellular)";
if ([platform isEqualToString:@"iPad4,3"]) return "iPad Air";
if ([platform isEqualToString:@"iPad4,4"]) return "iPad Mini (Wifi)";
if ([platform isEqualToString:@"iPad4,5"]) return "iPad Mini (Cellular)";
if ([platform isEqualToString:@"iPad4,6"]) return "iPad Mini 2 (Rev)";
if ([platform isEqualToString:@"iPad4,7"]) return "iPad Mini 3 (WiFi)";
if ([platform isEqualToString:@"iPad4,8"]) return "iPad Mini 3 (A1600)";
if ([platform isEqualToString:@"iPad4,9"]) return "iPad Mini 3 (A1601)";
if ([platform isEqualToString:@"iPad5,1"] ||
[platform isEqualToString:@"iPad5,2"]) return "iPad Mini 4";
if ([platform isEqualToString:@"iPad11,1"] ||
[platform isEqualToString:@"iPad11,2"]) return "iPad Mini 5";
if ([platform isEqualToString:@"iPad11,4"] ||
[platform isEqualToString:@"iPad11,5"]) return "iPad Air (3rd generation)";
if ([platform isEqualToString:@"iPad5,3"]) return "iPad Air 2 (WiFi)";
if ([platform isEqualToString:@"iPad5,4"]) return "iPad Air 2 (Cellular)";
if ([platform isEqualToString:@"iPad6,3"] ||
[platform isEqualToString:@"iPad6,4"]) return "iPad Pro (9.7-inch)";
if ([platform isEqualToString:@"iPad6,7"] ||
[platform isEqualToString:@"iPad6,8"]) return "iPad Pro (12.9-inch)";
if ([platform isEqualToString:@"iPad7,1"] ||
[platform isEqualToString:@"iPad7,2"]) return "iPad Pro (12.9-inch) (2nd generation)";
if ([platform isEqualToString:@"iPad7,3"] ||
[platform isEqualToString:@"iPad7,4"]) return "iPad Pro (10.5-inch)";
if ([platform isEqualToString:@"iPad8,1"] ||
[platform isEqualToString:@"iPad8,2"] ||
[platform isEqualToString:@"iPad8,3"] ||
[platform isEqualToString:@"iPad8,4"]) return "iPad Pro (11-inch)";
if ([platform isEqualToString:@"iPad8,5"] ||
[platform isEqualToString:@"iPad8,6"] ||
[platform isEqualToString:@"iPad8,7"] ||
[platform isEqualToString:@"iPad8,8"]) return "iPad Pro (12.9-inch) (3rd generation)";
if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"])
return "iPhone Simulator";
if ([platform isEqualToString:@"iPhone12,1"]) return @"iPhone 11";
if ([platform isEqualToString:@"iPhone12,3"]) return @"iPhone 11 Pro";
if ([platform isEqualToString:@"iPhone12,5"]) return @"iPhone 11 Pro Max";
Here's the updated list from @kevindelord including the iPhone SE.