获得iOS设备信息-电池,内存,cpu,磁盘等
以下内容从他处获得,于大家分享
电池信息可以从UIDevice batteryLevel得到,但是只能精确到0.05.
– (NSDictionary*)batteryLevel
{
CFTypeRef blob = IOPSCopyPowerSourcesInfo();
CFArrayRef sources = IOPSCopyPowerSourcesList(blob);
CFDictionaryRef pSource = NULL;
const void *psValue;
int numOfSources = CFArrayGetCount(sources);
if (numOfSources == 0)
{
CFRelease(blob);
CFRelease(sources);
NSLog(@”qhk: Error in CFArrayGetCount”);
return nil;
}
for (int i = 0 ; i < numOfSources ; i++)
{
pSource = IOPSGetPowerSourceDescription(blob, CFArrayGetValueAtIndex(sources, i));
if (!pSource)
{
CFRelease(blob);
CFRelease(sources);
NSLog(@”qhk: Error in IOPSGetPowerSourceDescription”);
return nil;
}
psValue = (CFStringRef)CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey));
int curCapacity = 0;
int maxCapacity = 0;
// double percent;
psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey));
CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);
psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey));
CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);
// percent = ((double)curCapacity/(double)maxCapacity * 100.0f);
NSNumber* no1 = [NSNumber numberWithInt:curCapacity];
NSNumber* no2= [NSNumber numberWithInt:maxCapacity];
CFRelease(blob);
CFRelease(sources);
return [NSDictionary dictionaryWithObjectsAndKeys:no1, @”no1″, no2, @”no2″, nil];
// return percent;
// return (NSInteger)(percent + 0.5f);
}
//#endif
CFRelease(blob);
CFRelease(sources);
return nil;
}
这个可以精确到0.01,但是好像与系统显示的仍有偏差。
得到平台号:
– (NSString*) doDevicePlatform
{
size_t size;
int nR = sysctlbyname(“hw.machine”, NULL, &size, NULL, 0);
char *machine = (char *)malloc(size);
nR = sysctlbyname(“hw.machine”, machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
free(machine);
return platform;
}
在根据平台号得到手机型号:
比如:
if ([platform isEqualToString:@”iPhone1,1″])
{
return @”iPhone”;
}
if ([platform isEqualToString:@”iPhone1,2″])
{
return @”iPhone3G”;
}
if ([platform isEqualToString:@”iPhone2,1″])
{
return @”iPhone3GS”;
}
if ([platform isEqualToString:@”iPhone3,1″])
{
return @”iPhone4″;
}
得到mac地址:
– (void)printmacinfo
{
bool success;
struct ifaddrs *addrs;
const struct ifaddrs *cursor;
const struct sockaddr_dl *dlAddr;
const uint8_t *base;
success = getifaddrs(&addrs) == 0;
if (success)
{
cursor = addrs;
NSInteger idx = 0;
while (cursor != NULL)
{
++idx;
NSString* macTitle = nil;
if ((cursor->ifa_flags & IFF_LOOPBACK) == 0 )
{
char* ifaname = (char *)cursor->ifa_name;
char* addr = inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr);
printf(“%s “, ifaname);
printf(“%s\n”, addr);
// NSString* tmpstr1 = [NSString stringWithCString:ifaname encoding:NSUTF8StringEncoding];
// NSString* tmpstr2 = [NSString stringWithCString:addr encoding:NSUTF8StringEncoding];
// NSString *tmpStr = [NSString stringWithFormat:@”%@ %@”, tmpstr1, tmpstr2];
macTitle = [NSString stringWithFormat:@”%d %s %s”, idx, ifaname, addr];
[_arrKey addObject:macTitle];
}
if ( (cursor->ifa_addr->sa_family == AF_LINK)
&& (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type ==IFT_ETHER)
)
{
dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
// fprintf(stderr, ” sdl_nlen = %d\n”, dlAddr->sdl_nlen);
// fprintf(stderr, ” sdl_alen = %d\n”, dlAddr->sdl_alen);
base = (const uint8_t *) &dlAddr->sdl_data[dlAddr->sdl_nlen];
printf(” MAC address “);
NSMutableString* tmpString = [[[NSMutableString alloc] initWithString:@”Mac:”] autorelease];
for (int i = 0; i < dlAddr->sdl_alen; i++)
{
if (i != 0)
{
printf(“:”);
[tmpString appendString:@”:”];
}
printf(“x”, base);
[tmpString appendFormat:@”X”, base];
}
printf(“\n”);
[_dic setObject:tmpString forKey:macTitle];
}
else if (macTitle != nil)
{
[_dic setObject:@”” forKey:macTitle];
}
cursor = cursor->ifa_next;
}
}
}
得到4种内存信息:
mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
vm_statistics_data_t vmstat;
if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count) != KERN_SUCCESS)
{
NSLog(@”Failed to get VM statistics.”);
[_dic setObject:@”Failed to get VM statistics.” forKey:KTTMemorySize_Wire];
}
else
{
float total = vmstat.wire_count + vmstat.active_count + vmstat.inactive_count + vmstat.free_count;
float wired = vmstat.wire_count / total * 100;
float active = vmstat.active_count / total * 100;
float inactive = vmstat.inactive_count / total * 100;
float free = vmstat.free_count / total * 100;
// NSString *str = [NSString stringWithFormat:@”%d %d %d %d %.2f %.2f %.2f %.2f %.0f %.0f”
// , vmstat.wire_count, vmstat.active_count, vmstat.inactive_count, vmstat.free_count
// , wired, active, inactive, free
// , total, total * pageSize
// ];
}
cpu和总线频率:
int result;
mib[0] = CTL_HW;
mib[1] = HW_CPU_FREQ;
length = sizeof(result);
if (sysctl(mib, 2, &result, &length, NULL, 0) < 0)
{
perror(“getting cpu frequency”);
}
printf(“CPU Frequency = %u hz\n”, result);
int result2;
mib[0] = CTL_HW;
mib[1] = HW_BUS_FREQ;
length = sizeof(result2);
if (sysctl(mib, 2, &result2, &length, NULL, 0) < 0)
{
perror(“getting bus frequency”);
}
printf(“Bus Frequency = %u hz\n”, result);
网络方面使用的苹果列子文档中的Reachability.h和Reachability.m
外部ip访问http://automation.whatismyip.com/n09230945.asp即可知道。
gethostbyname可知内部局域网ip。
NetworkStatus netstatus = [reachable currentReachabilityStatus];
switch (netstatus)
{
case NotReachable:
// 没有网络连接
reachableStatus = NSLocalizedString(@”No Network”, “”);
break;
case ReachableViaWWAN:
// 使用3G网络
reachableStatus = @”GPRS/3G”;
break;
case ReachableViaWiFi:
// 使用WiFi网络
reachableStatus = @”WIFI”;
break;
}
这个可知网络类型。
内存大小:
size_t size = sizeof(int);
int results;
int mib[2] = {CTL_HW, HW_PHYSMEM};
sysctl(mib, 2, &results, &size, NULL, 0);
总磁盘大小:
NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];
[fattributes objectForKey:NSFileSystemSize];
剩余空间:
[fattributes objectForKey:NSFileSystemFreeSize];
手机号码:
这个也是undocument api
NSString* phoneNumber = CTSettingCopyMyPhoneNumber();
NSArray *getValue(NSString *iosearch)
{
mach_port_t masterPort;
CFTypeID propID = (CFTypeID) NULL;
unsigned int bufSize;
kern_return_t kr = IOMasterPort(MACH_PORT_NULL, &masterPort);
if (kr != noErr) return nil;
io_registry_entry_t entry = IORegistryGetRootEntry(masterPort);
if (entry == MACH_PORT_NULL) return nil;
CFTypeRef prop = IORegistryEntrySearchCFProperty(entry, kIODeviceTreePlane, (CFStringRef) iosearch, nil, kIORegistryIterateRecursively);
if (!prop) return nil;
propID = CFGetTypeID(prop);
if (!(propID == CFDataGetTypeID()))
{
mach_port_deallocate(mach_task_self(), masterPort);
CFRelease(prop);
return nil;
}
CFDataRef propData = (CFDataRef) prop;
if (!propData)
{
CFRelease(prop);
return nil;
}
bufSize = CFDataGetLength(propData);
if (!bufSize)
{
CFRelease(prop);
return nil;
}
NSString *p1 = [[[NSString alloc] initWithBytes:CFDataGetBytePtr(propData) length:bufSize encoding:1] autorelease];
mach_port_deallocate(mach_task_self(), masterPort);
CFRelease(prop);
return [p1 componentsSeparatedByString:@”\0″];
}
这个可以用来得到部分数据。
– (NSString *) imei
{
NSArray *results = getValue(@”device-imei”);
if (results) return [results objectAtIndex:0];
return nil;
}
– (NSString *) serialnumber
{
NSArray *results = getValue(@”serial-number”);
if (results) return [results objectAtIndex:0];
return nil;
}
– (NSString *) backlightlevel
{
NSArray *results = getValue(@”backlight-level”);
if (results) return [results objectAtIndex:0];
return nil;
}
分别得到imei,序列号,背光