概述
以下内容从他处获得,于大家分享 电池信息可以从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("%sn", 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 = %dn", dlAddr->sdl_nlen); // fprintf(stderr, " sdl_alen = %dn", 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); [tmpString appendFormat:@"%02X", 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 hzn", 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 hzn", 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:@" |