IOS 获取,如电量,CPU,型号等
- (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";
}
- (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;
}
}
}
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
// ];
}
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);
外部ip访问http://automation.whatismyip.com/n09230945.asp即可知道。
gethostbyname可知内部局域网ip。
switch (netstatus)
{
case NotReachable:
// 没有网络连接
reachableStatus = NSLocalizedString(@"No Network", "");
break;
case ReachableViaWWAN:
// 使用3G网络
reachableStatus = @"GPRS/3G";
break;
case ReachableViaWiFi:
// 使用WiFi网络
reachableStatus = @"WIFI";
break;
}
这个可知网络类型。
+(NSString *)getNetWorkStates{
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
NSString *state = [[NSString alloc]init];
int netType = 0;
//获取到网络返回码
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
//获取到状态栏
netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
switch (netType) {
case 0:
state = @"无网络";
//无网模式
break;
case 1:
state = @"2G";
break;
case 2:
state = @"3G";
break;
case 3:
state = @"4G";
break;
case 5:
{
state = @"WIFI";
}
break;
default:
break;
}
}
}
//根据状态选择
return state;
}
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();
{
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"];
}
这个可以用来得到部分数据。
{
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,序列号,背光。
2010年开始苹果清理了一批APP Store上的WIFI扫描软件, 缘由语焉不详.
这些WIFI扫描软件使用了苹果的私有函数apple80211.framework
尽管不能合法(指能通过App Store的审核)的获取WIFI列表, 不过我们还是可以获取到当前Wifi连接的信息,比如SSID.
SSID全称Service Set IDentifier, 即Wifi网络的公开名称.
苹果在IOS v4.1+版本上提供了公开的方法来获取该信息.
示范代码如下:
- #import <SystemConfiguration/CaptiveNetwork.h>
- - (id)fetchSSIDInfo
- {
- NSArray *ifs = (id)CNCopySupportedInterfaces();
- NSLog(@"%s: Supported interfaces: %@", __func__, ifs);
- id info = nil;
- for (NSString *ifnam in ifs) {
- info = (id)CNCopyCurrentNetworkInfo((CFStringRef)ifnam);
- NSLog(@"%s: %@ => %@", __func__, ifnam, info);
- if (info && [info count]) {
- break;
- }
- [info release];
- }
- [ifs release];
- return [info autorelease];
- }
对于ARC版本, 代码可简化如下:
- - (id)fetchSSIDInfo {
- NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
- NSLog(@"Supported interfaces: %@", ifs);
- id info = nil;
- for (NSString *ifnam in ifs) {
- info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
- NSLog(@"%@ => %@", ifnam, info);
- if (info && [info count]) { break; }
- }
- return info;
- }
参考链接:
1. http://stackoverflow.com/questions/5198716/iphone-get-ssid-without-private-library
2. http://answers.yahoo.com/question/index?qid=20100529040141AAKd8dO
#import <SystemConfiguration/CaptiveNetwork.h>
NSString *ssid = @"Not Found";
NSString *macIp = @"Not Found";
CFArrayRef myArray = CNCopySupportedInterfaces();
if (myArray != nil) {
CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
if (myDict != nil) {
NSDictionary *dict = (NSDictionary*)CFBridgingRelease(myDict);
ssid = [dict valueForKey:@"SSID"];
macIp = [dict valueForKey:@"BSSID"];
}
}
UIAlertView *av = [[UIAlertView alloc] initWithTitle:ssid
message:macIp
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[av show];
/*
iphone获取sim卡信息
1.加入一个Framework(CoreTelephony.framework).
2.引入头文件
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>
3.初始化
*/
//-----------------------------------
具体demo
//-----------------------------------
#import <UIKit/UIKit.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>
@interface RootViewController : UITableViewController
{
//声明变量
CTTelephonyNetworkInfo *networkInfo;
}
@end
@implementation RootViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.prompt = @"CTTelephonyNetworkInfo";
self.navigationItem.title = @"CTCarrier";
//初始化
networkInfo = [[CTTelephonyNetworkInfo alloc] init];
//当sim卡更换时弹出此窗口
networkInfo.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier){
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:@"Sim card changed" delegate:nilcancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
[alert show];
};
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//获取sim卡信息
CTCarrier *carrier = networkInfo.subscriberCellularProvider;
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:CellIdentifier];
}
switch (indexPath.row) {
case 0://供应商名称(中国联通 中国移动)
cell.textLabel.text = @"carrierName";
cell.detailTextLabel.text = carrier.carrierName;
break;
case 1://所在国家编号
cell.textLabel.text = @"mobileCountryCode";
cell.detailTextLabel.text = carrier.mobileCountryCode;
break;
case 2://供应商网络编号
cell.textLabel.text = @"mobileNetworkCode";
cell.detailTextLabel.text = carrier.mobileNetworkCode;
break;
case 3:
cell.textLabel.text = @"isoCountryCode";
cell.detailTextLabel.text = carrier.isoCountryCode;
break;
case 4://是否允许voip
cell.textLabel.text = @"allowsVOIP";
cell.detailTextLabel.text = carrier.allowsVOIP?@"YES":@"NO";
break;
default:
break;
}
return cell;
}