参考了很多帖子,最后根据项目需求,修正了一些错误,总结了一个相对更全面一些的公用模块:
#import <UIKit/UIKit.h> @interface UIDevice (Info) + (NSString *) device; //设备类型(x86_64 iPod5,1) + (NSString *) deviceModel; //设备模式(iPad iPod iPhone) + (NSString *) osVersion; //系统版本 + (NSString *) os; //平台 + (NSString *) carrier; //运营商 + (NSString *) resolution; //分辨率 + (NSString *) locale; //地域 + (NSString *) appVersion; //程序版本 + (NSNumber *) timestamp; //unix timestamp + (NSString *) cpuType; //cpu型号 + (NSString *) cpuFrequency; //cpu频率 + (NSUInteger) cpuCount; //cpu核数 + (NSArray *) cpuUsage; //cpu利用率 + (NSUInteger) totalMemoryBytes; //获取手机内存总量,返回的是字节数 + (NSUInteger) freeMemoryBytes; //获取手机可用内存,返回的是字节数 + (long long) freeDiskSpaceBytes; //获取手机硬盘空闲空间,返回的是字节数 + (long long) totalDiskSpaceBytes; //获取手机硬盘总空间,返回的是字节数 + (BOOL ) isJailBreak; //是否越狱 + (BOOL ) bluetoothCheck; //是否支持蓝牙 @end
#import "UIDevice+Info.h" #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import <CoreTelephony/CTCarrier.h> #import <mach/mach.h> #import <mach/mach_host.h> #import <sys/types.h> #import <sys/param.h> #import <sys/mount.h> #import <mach/processor_info.h> #include <sys/types.h> #include <sys/sysctl.h> #include <sys/socket.h> #include <sys/sysctl.h> #include <sys/stat.h> #include <net/if.h> #include <net/if_dl.h> #define IFPGA_NAMESTRING @"iFPGA" #define IPHONE_1G_NAMESTRING @"iPhone 1G" #define IPHONE_3G_NAMESTRING @"iPhone 3G" #define IPHONE_3GS_NAMESTRING @"iPhone 3GS" #define IPHONE_4_NAMESTRING @"iPhone 4" #define IPHONE_4S_NAMESTRING @"iPhone 4S" #define IPHONE_5_NAMESTRING @"iPhone 5" #define IPHONE_UNKNOWN_NAMESTRING @"Unknown iPhone" #define IPOD_1G_NAMESTRING @"iPod touch 1G" #define IPOD_2G_NAMESTRING @"iPod touch 2G" #define IPOD_3G_NAMESTRING @"iPod touch 3G" #define IPOD_4G_NAMESTRING @"iPod touch 4G" #define IPOD_UNKNOWN_NAMESTRING @"Unknown iPod" #define IPAD_1G_NAMESTRING @"iPad 1G" #define IPAD_2G_NAMESTRING @"iPad 2G" #define IPAD_3G_NAMESTRING @"iPad 3G" #define IPAD_4G_NAMESTRING @"iPad 4G" #define IPAD_UNKNOWN_NAMESTRING @"Unknown iPad" #define APPLETV_2G_NAMESTRING @"Apple TV 2G" #define APPLETV_3G_NAMESTRING @"Apple TV 3G" #define APPLETV_4G_NAMESTRING @"Apple TV 4G" #define APPLETV_UNKNOWN_NAMESTRING @"Unknown Apple TV" #define IOS_FAMILY_UNKNOWN_DEVICE @"Unknown iOS device" #define SIMULATOR_NAMESTRING @"iPhone Simulator" #define SIMULATOR_IPHONE_NAMESTRING @"iPhone Simulator" #define SIMULATOR_IPAD_NAMESTRING @"iPad Simulator" #define SIMULATOR_APPLETV_NAMESTRING @"Apple TV Simulator" // :) //iPhone 3G 以后各代的CPU型号和频率 #define IPHONE_3G_CPUTYPE @"ARM11" #define IPHONE_3G_CPUFREQUENCY @"412MHz" #define IPHONE_3GS_CPUTYPE @"ARM Cortex A8" #define IPHONE_3GS_CPUFREQUENCY @"600MHz" #define IPHONE_4_CPUTYPE @"Apple A4" #define IPHONE_4_CPUFREQUENCY @"1GMHz" #define IPHONE_4S_CPUTYPE @"Apple A5 Double Core" #define IPHONE_4S_CPUFREQUENCY @"800MHz" //iPod touch 4G 的CPU型号和频率 #define IPOD_4G_CPUTYPE @"Apple A4" #define IPOD_4G_CPUFREQUENCY @"800MHz" #define IOS_CPUTYPE_UNKNOWN @"Unknown CPU type" #define IOS_CPUFREQUENCY_UNKNOWN @"Unknown CPU frequency" typedef enum { UIDeviceUnknown, UIDeviceSimulator, UIDeviceSimulatoriPhone, UIDeviceSimulatoriPad, UIDeviceSimulatorAppleTV, UIDevice1GiPhone, UIDevice3GiPhone, UIDevice3GSiPhone, UIDevice4iPhone, UIDevice4SiPhone, UIDevice5iPhone, UIDevice1GiPod, UIDevice2GiPod, UIDevice3GiPod, UIDevice4GiPod, UIDevice1GiPad, UIDevice2GiPad, UIDevice3GiPad, UIDevice4GiPad, UIDeviceAppleTV2, UIDeviceAppleTV3, UIDeviceAppleTV4, UIDeviceUnknowniPhone, UIDeviceUnknowniPod, UIDeviceUnknowniPad, UIDeviceUnknownAppleTV, UIDeviceIFPGA, } UIDevicePlatform; typedef enum { UIDeviceFamilyiPhone, UIDeviceFamilyiPod, UIDeviceFamilyiPad, UIDeviceFamilyAppleTV, UIDeviceFamilyUnknown, } UIDeviceFamily; @implementation UIDevice (Info) + (NSString *)device { 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 *) deviceModel { NSString *model = [[UIDevice currentDevice] model]; if ([model hasPrefix:@"iPad"]) { return @"iPad"; } else if ([model hasPrefix:@"iPod"]) { return @"iPod"; } else if ([model hasPrefix:@"iPhone"]){ return @"iPhone"; } return nil; } + (NSString *)osVersion { return [[UIDevice currentDevice] systemVersion]; } + (NSString*)os { return @"iOS"; } + (NSString *)carrier { if (NSClassFromString(@"CTTelephonyNetworkInfo")) { CTTelephonyNetworkInfo *netinfo = [[[CTTelephonyNetworkInfo alloc] init] autorelease]; CTCarrier *carrier = [netinfo subscriberCellularProvider]; return [carrier carrierName]; } return @""; } + (NSString *)resolution { CGRect bounds = [[UIScreen mainScreen] bounds]; CGFloat scale = [[UIScreen mainScreen] respondsToSelector:@selector(scale)] ? [[UIScreen mainScreen] scale] : 1.f; CGSize res = CGSizeMake(bounds.size.width * scale, bounds.size.height * scale); NSString *result = [NSString stringWithFormat:@"%gx%g", res.width, res.height]; return result; } + (NSString *)locale { return [[NSLocale currentLocale] localeIdentifier]; } + (NSString *)appVersion { return [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]; } + (NSNumber *)timestamp { return [NSNumber numberWithLong:time(NULL)]; } #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]; free(answer); return results; } #pragma mark platform information + (NSString *) platform { return [self getSysInfoByName:"hw.machine"]; } + (NSUInteger) platformType { NSString *platform = [self platform]; // The ever mysterious iFPGA if ([platform isEqualToString:@"iFPGA"]) return UIDeviceIFPGA; // iPhone 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 UIDevice4SiPhone; if ([platform hasPrefix:@"iPhone5"]) return UIDevice5iPhone; // iPod if ([platform hasPrefix:@"iPod1"]) return UIDevice1GiPod; if ([platform hasPrefix:@"iPod2"]) return UIDevice2GiPod; if ([platform hasPrefix:@"iPod3"]) return UIDevice3GiPod; if ([platform hasPrefix:@"iPod4"]) return UIDevice4GiPod; // iPad if ([platform hasPrefix:@"iPad1"]) return UIDevice1GiPad; if ([platform hasPrefix:@"iPad2"]) return UIDevice2GiPad; if ([platform hasPrefix:@"iPad3"]) return UIDevice3GiPad; if ([platform hasPrefix:@"iPad4"]) return UIDevice4GiPad; // Apple TV if ([platform hasPrefix:@"AppleTV2"]) return UIDeviceAppleTV2; if ([platform hasPrefix:@"AppleTV3"]) return UIDeviceAppleTV3; if ([platform hasPrefix:@"iPhone"]) return UIDeviceUnknowniPhone; if ([platform hasPrefix:@"iPod"]) return UIDeviceUnknowniPod; if ([platform hasPrefix:@"iPad"]) return UIDeviceUnknowniPad; if ([platform hasPrefix:@"AppleTV"]) return UIDeviceUnknownAppleTV; // Simulator thanks Jordan Breeding if ([platform hasSuffix:@"86"] || [platform isEqual:@"x86_64"]) { BOOL smallerScreen = [[UIScreen mainScreen] bounds].size.width < 768; return smallerScreen ? UIDeviceSimulatoriPhone : UIDeviceSimulatoriPad; } 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 UIDevice4SiPhone: return IPHONE_4S_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 UIDevice2GiPad : return IPAD_2G_NAMESTRING; case UIDevice3GiPad : return IPAD_3G_NAMESTRING; case UIDevice4GiPad : return IPAD_4G_NAMESTRING; case UIDeviceUnknowniPad : return IPAD_UNKNOWN_NAMESTRING; case UIDeviceAppleTV2 : return APPLETV_2G_NAMESTRING; case UIDeviceAppleTV3 : return APPLETV_3G_NAMESTRING; case UIDeviceAppleTV4 : return APPLETV_4G_NAMESTRING; case UIDeviceUnknownAppleTV: return APPLETV_UNKNOWN_NAMESTRING; case UIDeviceSimulator: return SIMULATOR_NAMESTRING; case UIDeviceSimulatoriPhone: return SIMULATOR_IPHONE_NAMESTRING; case UIDeviceSimulatoriPad: return SIMULATOR_IPAD_NAMESTRING; case UIDeviceSimulatorAppleTV: return SIMULATOR_APPLETV_NAMESTRING; case UIDeviceIFPGA: return IFPGA_NAMESTRING; default: return IOS_FAMILY_UNKNOWN_DEVICE; } } #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; } #pragma mark cpu information + (NSString *) cpuType { switch ([self platformType]) { case UIDevice3GiPhone: return IPHONE_3G_CPUTYPE; case UIDevice3GSiPhone: return IPHONE_3GS_CPUTYPE; case UIDevice4iPhone: return IPHONE_4_CPUTYPE; case UIDevice4SiPhone: return IPHONE_4S_CPUTYPE; case UIDevice4GiPod: return IPOD_4G_CPUTYPE; default: return IOS_CPUTYPE_UNKNOWN; } } + (NSString *) cpuFrequency { switch ([self platformType]) { case UIDevice3GiPhone: return IPHONE_3G_CPUFREQUENCY; case UIDevice3GSiPhone: return IPHONE_3GS_CPUFREQUENCY; case UIDevice4iPhone: return IPHONE_4_CPUFREQUENCY; case UIDevice4SiPhone: return IPHONE_4S_CPUFREQUENCY; case UIDevice4GiPod: return IPOD_4G_CPUFREQUENCY; default: return IOS_CPUFREQUENCY_UNKNOWN; } } + (NSUInteger) cpuCount { return [self getSysInfo:HW_NCPU]; } + (NSArray *)cpuUsage { NSMutableArray *usage = [NSMutableArray array]; // float usage = 0; processor_info_array_t _cpuInfo, _prevCPUInfo = nil; mach_msg_type_number_t _numCPUInfo, _numPrevCPUInfo = 0; unsigned _numCPUs; NSLock *_cpuUsageLock; int _mib[2U] = { CTL_HW, HW_NCPU }; size_t _sizeOfNumCPUs = sizeof(_numCPUs); int _status = sysctl(_mib, 2U, &_numCPUs, &_sizeOfNumCPUs, NULL, 0U); if(_status) _numCPUs = 1; _cpuUsageLock = [[NSLock alloc] init]; natural_t _numCPUsU = 0U; kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &_numCPUsU, &_cpuInfo, &_numCPUInfo); if(err == KERN_SUCCESS) { [_cpuUsageLock lock]; for(unsigned i = 0U; i < _numCPUs; ++i) { Float32 _inUse, _total; if(_prevCPUInfo) { _inUse = ( (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]) + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM]) + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]) ); _total = _inUse + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]); } else { _inUse = _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]; _total = _inUse + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]; } // NSLog(@"Core : %u, Usage: %.2f%%", i, _inUse / _total * 100.f); float u = _inUse / _total * 100.f; [usage addObject:[NSNumber numberWithFloat:u]]; } [_cpuUsageLock unlock]; if(_prevCPUInfo) { size_t prevCpuInfoSize = sizeof(integer_t) * _numPrevCPUInfo; vm_deallocate(mach_task_self(), (vm_address_t)_prevCPUInfo, prevCpuInfoSize); } _prevCPUInfo = _cpuInfo; _numPrevCPUInfo = _numCPUInfo; _cpuInfo = nil; _numCPUInfo = 0U; } else { NSLog(@"Error!"); } return usage; } #pragma mark memory information + (NSUInteger) totalMemoryBytes { return [self getSysInfo:HW_PHYSMEM]; } + (NSUInteger) freeMemoryBytes { mach_port_t host_port = mach_host_self(); mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t); vm_size_t pagesize; vm_statistics_data_t vm_stat; host_page_size(host_port, &pagesize); if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) NSLog(@"Failed to fetch vm statistics"); // natural_t mem_used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pagesize; natural_t mem_free = vm_stat.free_count * pagesize; // natural_t mem_total = mem_used + mem_free; return mem_free; } #pragma mark disk information + (long long) freeDiskSpaceBytes { struct statfs buf; long long freespace; freespace = 0; if(statfs("/private/var", &buf) >= 0){ freespace = (long long)buf.f_bsize * buf.f_bfree; } return freespace; } + (long long) totalDiskSpaceBytes { struct statfs buf; long long totalspace; totalspace = 0; if(statfs("/private/var", &buf) >= 0){ totalspace = (long long)buf.f_bsize * buf.f_blocks; } return totalspace; } + (BOOL) isJailBreak { // int res = access("/var/mobile/Library/AddressBook/AddressBook.sqlitedb", F_OK); // if (res != 0) // return NO; // return YES; BOOL jailbroken = NO; NSString *cydiaPath = @"/Applications/Cydia.app"; NSString *aptPath = @"/private/var/lib/apt/"; if ([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) { jailbroken = YES; } if ([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) { jailbroken = YES; } return jailbroken; } #pragma mark bluetooth information + (BOOL) bluetoothCheck { switch ([self platformType]) { case UIDevice3GiPhone: return YES; case UIDevice3GSiPhone: return YES; case UIDevice4iPhone: return YES; case UIDevice4SiPhone: return YES; case UIDevice5iPhone: return YES; case UIDevice3GiPod: return YES; case UIDevice4GiPod: return YES; case UIDevice1GiPad : return YES; case UIDevice2GiPad : return YES; case UIDevice3GiPad : return YES; case UIDevice4GiPad : return YES; default: return NO; } } @end