Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
executable file 292 lines (236 sloc) 8.23 KB
Erica Sadun,
iPhone Developer's Cookbook, 3.0 Edition
BSD License, Use at your own risk
// Thanks to Emanuele Vulcano, Kevin Ballard/Eridius, Ryandjohnson, Matt Brown, etc.
#include <sys/socket.h> // Per msqr
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#import "UIDevice-Hardware.h"
@implementation UIDevice (Hardware)
iFPGA -> ??
iPhone1,1 -> iPhone 1G
iPhone1,2 -> iPhone 3G
iPhone2,1 -> iPhone 3GS
iPhone3,1 -> iPhone 4/AT&T
iPhone3,2 -> iPhone 4/Other Carrier?
iPhone3,3 -> iPhone 4/Other Carrier?
iPhone4,1 -> ??iPhone 5
iPod1,1 -> iPod touch 1G
iPod2,1 -> iPod touch 2G
iPod2,2 -> ??iPod touch 2.5G
iPod3,1 -> iPod touch 3G
iPod4,1 -> iPod touch 4G
iPod5,1 -> ??iPod touch 5G
iPad1,1 -> iPad 1G, WiFi
iPad1,? -> iPad 1G, 3G <- needs 3G owner to test
iPad2,1 -> iPad 2G, WiFi
iPad2,2 -> iPad 2G, 3G GSM
iPad2,3 -> iPad 2G, 3G CDMA
AppleTV2,1 -> AppleTV 2
i386, x86_64 -> iPhone Simulator
#pragma mark sysctlbyname utils
- (NSString *) getSysInfoByName:(char *)typeSpecifier
size_t size;
sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
char *answer = malloc(size);
sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
return results;
- (NSString *) platform
return [self getSysInfoByName:"hw.machine"];
// Thanks, Atomicbird
- (NSString *) hwmodel
return [self getSysInfoByName:"hw.model"];
#pragma mark sysctl utils
- (NSUInteger) getSysInfo: (uint) typeSpecifier
size_t size = sizeof(int);
int results;
int mib[2] = {CTL_HW, typeSpecifier};
sysctl(mib, 2, &results, &size, NULL, 0);
return (NSUInteger) results;
- (NSUInteger) cpuFrequency
return [self getSysInfo:HW_CPU_FREQ];
- (NSUInteger) busFrequency
return [self getSysInfo:HW_BUS_FREQ];
- (NSUInteger) totalMemory
return [self getSysInfo:HW_PHYSMEM];
- (NSUInteger) userMemory
return [self getSysInfo:HW_USERMEM];
- (NSUInteger) maxSocketBufferSize
return [self getSysInfo:KIPC_MAXSOCKBUF];
#pragma mark file system -- Thanks Joachim Bean!
- (NSNumber *) totalDiskSpace
NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];
return [fattributes objectForKey:NSFileSystemSize];
- (NSNumber *) freeDiskSpace
NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];
return [fattributes objectForKey:NSFileSystemFreeSize];
#pragma mark platform type and name utils
- (NSUInteger) platformType
NSString *platform = [self platform];
// if ([platform isEqualToString:@"XX"]) return UIDeviceUnknown;
if ([platform isEqualToString:@"iFPGA"]) return UIDeviceIFPGA;
if ([platform isEqualToString:@"iPhone1,1"]) return UIDevice1GiPhone;
if ([platform isEqualToString:@"iPhone1,2"]) return UIDevice3GiPhone;
if ([platform hasPrefix:@"iPhone2"]) return UIDevice3GSiPhone;
if ([platform hasPrefix:@"iPhone3"]) return UIDevice4iPhone;
if ([platform hasPrefix:@"iPhone4"]) return UIDevice5iPhone;
if ([platform isEqualToString:@"iPod1,1"]) return UIDevice1GiPod;
if ([platform isEqualToString:@"iPod2,1"]) return UIDevice2GiPod;
if ([platform isEqualToString:@"iPod3,1"]) return UIDevice3GiPod;
if ([platform isEqualToString:@"iPod4,1"]) return UIDevice4GiPod;
if ([platform isEqualToString:@"iPad1,1"]) return UIDevice1GiPad;
if ([platform isEqualToString:@"iPad2,1"]) return UIDevice2GiPadWiFi;
if ([platform isEqualToString:@"iPad2,2"]) return UIDevice2GiPad3GGSM;
if ([platform isEqualToString:@"iPad2,3"]) return UIDevice2GiPad3GCDMA;
if ([platform isEqualToString:@"AppleTV2,1"]) return UIDeviceAppleTV2;
if ([platform hasPrefix:@"iPhone"]) return UIDeviceUnknowniPhone;
if ([platform hasPrefix:@"iPod"]) return UIDeviceUnknowniPod;
if ([platform hasPrefix:@"iPad"]) return UIDeviceUnknowniPad;
if ([platform hasSuffix:@"86"] || [platform isEqual:@"x86_64"]) // thanks Jordan Breeding
if ([[UIScreen mainScreen] bounds].size.width < 768)
return UIDeviceiPhoneSimulatoriPhone;
return UIDeviceiPhoneSimulatoriPad;
return UIDeviceiPhoneSimulator;
return UIDeviceUnknown;
- (NSString *) platformString
switch ([self platformType])
case UIDevice1GiPhone: return IPHONE_1G_NAMESTRING;
case UIDevice3GiPhone: return IPHONE_3G_NAMESTRING;
case UIDevice3GSiPhone: return IPHONE_3GS_NAMESTRING;
case UIDevice4iPhone: return IPHONE_4_NAMESTRING;
case UIDevice5iPhone: return IPHONE_5_NAMESTRING;
case UIDeviceUnknowniPhone: return IPHONE_UNKNOWN_NAMESTRING;
case UIDevice1GiPod: return IPOD_1G_NAMESTRING;
case UIDevice2GiPod: return IPOD_2G_NAMESTRING;
case UIDevice3GiPod: return IPOD_3G_NAMESTRING;
case UIDevice4GiPod: return IPOD_4G_NAMESTRING;
case UIDeviceUnknowniPod: return IPOD_UNKNOWN_NAMESTRING;
case UIDevice1GiPad : return IPAD_1G_NAMESTRING;
case UIDevice2GiPadWiFi : return IPAD_2G_WIFI_NAMESTRING;
case UIDevice2GiPad3GGSM : return IPAD_2G_3G_GSM_NAMESTRING;
case UIDevice2GiPad3GCDMA : return IPAD_2G_3G_CDMA_NAMESTRING;
case UIDeviceAppleTV2 : return APPLETV_2G_NAMESTRING;
case UIDeviceiPhoneSimulator: return IPHONE_SIMULATOR_NAMESTRING;
case UIDeviceiPhoneSimulatoriPhone: return IPHONE_SIMULATOR_IPHONE_NAMESTRING;
case UIDeviceiPhoneSimulatoriPad: return IPHONE_SIMULATOR_IPAD_NAMESTRING;
#pragma mark MAC addy
// Return the local MAC addy
// Courtesy of FreeBSD hackers email list
// Accidentally munged during previous update. Fixed thanks to mlamb.
- (NSString *) macaddress
int mib[6];
size_t len;
char *buf;
unsigned char *ptr;
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_LINK;
mib[4] = NET_RT_IFLIST;
if ((mib[5] = if_nametoindex("en0")) == 0) {
printf("Error: if_nametoindex error\n");
return NULL;
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 1\n");
return NULL;
if ((buf = malloc(len)) == NULL) {
printf("Could not allocate memory. error!\n");
return NULL;
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 2");
return NULL;
ifm = (struct if_msghdr *)buf;
sdl = (struct sockaddr_dl *)(ifm + 1);
ptr = (unsigned char *)LLADDR(sdl);
// NSString *outstring = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
NSString *outstring = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
return [outstring uppercaseString];
- (NSString *) platformCode
switch ([self platformType])
case UIDevice1GiPhone: return @"M68";
case UIDevice3GiPhone: return @"N82";
case UIDevice3GSiPhone: return @"N88";
case UIDevice4iPhone: return @"N89";
case UIDevice5iPhone: return IPHONE_UNKNOWN_NAMESTRING;
case UIDeviceUnknowniPhone: return IPHONE_UNKNOWN_NAMESTRING;
case UIDevice1GiPod: return @"N45";
case UIDevice2GiPod: return @"N72";
case UIDevice3GiPod: return @"N18";
case UIDevice4GiPod: return @"N80";
case UIDeviceUnknowniPod: return IPOD_UNKNOWN_NAMESTRING;
case UIDevice1GiPad: return @"K48";
case UIDevice2GiPadWiFi: return @"K93";
case UIDevice2GiPad3GGSM: return @"K94";
case UIDevice2GiPad3GCDMA: return @"K95";
case UIDeviceUnknowniPad: return IPAD_UNKNOWN_NAMESTRING;
case UIDeviceAppleTV2: return @"K66";
case UIDeviceiPhoneSimulator: return IPHONE_SIMULATOR_NAMESTRING;
// Illicit Bluetooth check -- cannot be used in App Store
Class btclass = NSClassFromString(@"GKBluetoothSupport");
if ([btclass respondsToSelector:@selector(bluetoothStatus)])
printf("BTStatus %d\n", ((int)[btclass performSelector:@selector(bluetoothStatus)] & 1) != 0);
bluetooth = ((int)[btclass performSelector:@selector(bluetoothStatus)] & 1) != 0;
printf("Bluetooth %s enabled\n", bluetooth ? "is" : "isn't");