显示ios设备信息的程序
以下是运行在本人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。
外部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
这个也是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,序列号,背光。