您的位置:首页 > 移动开发 > IOS开发

显示ios设备信息的程序

2015-08-06 15:43 417 查看
以下是运行在本人iphone4上的截图,支持中文简体,中文繁体,英文,支持iphone和ipad,当然由于没有ipad,ipad的测试用的模拟器。
支持iphone4的Retina屏幕。
本来有6个标签,但是iphone的很多信息实在得不到,现在只剩下了4个标签。



这里面的电量精确到0.01,用的undocument api,但是个人感觉总是比右上角系统自己显示的偏低3%以内。



显示当前运行的进程,但是不知道如何得到进程的图标,因此统一用的图标。



一些硬件信息,iphone4的A4 cpu频率实际上得不到,始终显示为0,只好根据手机型号判断,如果是iphone4则显示800Mhz,(据说是1G的cpu降频到800Mhz)。



宣传devdiv的信息。

ipa包如下:


FeiPhoneInfo.ipa

图标来源于网络。

每张图中右边的圆圈是ios5的手势触摸的东东。
展开来后是这个样子,可以有效的降低home键的使用。



部分信息是UIDevice里的。
电池信息可以从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(“%02x”, base[i]);

[tmpString appendFormat:@"%02X", base[i]];

}

printf(“\n”);

[_dic setObject:tmpString forKey:macTitle];

}

else if (macTitle != nil)

{

[_dic setObject:@"" forKey:macTitle];

}

cursor = cursor->ifa_next;

}

}

}

页大小

int pageSize = 0;

size_t length = sizeof(pageSize);

sysctlbyname(“hw.pagesize”, >pageSize, >length, NULL, 0);

得到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,序列号,背光。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: