設備信息專題
iOS的APP的應用開發的過程中,有時爲了bug跟蹤或者獲取用反饋的需要自動收集用戶設備、系統信息、應用信息等等,這些信息方便開發者診斷問題,當然這些信息是用戶的非隱私信息,是通過開發api可以獲取到的。那麼通過那些api可以獲取這些信息呢,iOS的SDK中提供了UIDevice,NSBundle,NSLocale。
1 UIDevice類
UIDevice提供了多種屬性、類函數及狀態通知,幫助我們全方位瞭解設備狀況。從檢測電池電量到定位設備與臨近感應,UIDevice所做的工作就是爲應用程序提供用戶及設備的一些信息。UIDevice類還能夠收集關於設備的各種具體細節,例如機型及iOS版本等。其中大部分屬性都對開發工作具有積極的輔助作用。下面的代碼簡單的使用UIDevice獲取手機屬性。
1.1 獲取設備基本信息
UIDevice *device_=[[UIDevicealloc] init];
NSLog(@"設備所有者的名稱--%@",device_.name);
NSLog(@"設備的類別-----%@",device_.model);
NSLog(@"設備的的本地化版本-%@",device_.localizedModel);
NSLog(@"設備運行的系統---%@",device_.systemName);
NSLog(@"當前系統的版本---%@",device_.systemVersion);
NSLog(@"設備唯一識別碼-----%@",device_.identifierForVendor.UUIDString);
//得到設備屏幕高度
float screenHeight=[UIScreenmainScreen].bounds.size.height;
打印結果如下
2013-03-08 17:31:13.944WaiMai[14982:907]設備所有者的名稱--“zhangqingfeng”的iPhone
2013-03-08 17:31:13.951WaiMai[14982:907]設備的類別-----iPhone
2013-03-08 17:31:13.953WaiMai[14982:907]設備的的本地化版本-iPhone
2013-03-08 17:31:13.957WaiMai[14982:907]設備運行的系統---iPhone OS
2013-03-08 17:31:13.961WaiMai[14982:907]當前系統的版本---6.0.1
2013-03-08 17:31:13.969WaiMai[14982:907]設備識別碼-----7305AFE8-66C0-4C6B-8173-1AA61E9F837D
2013-03-08 17:31:14.178 WaiMai[14982:1703]
1.2 獲取設備的唯一標示符
NSString *identifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
1.3 獲取當前屏幕分辨率的信息
1 CGRect rect = [[UIScreen mainScreen] bounds];
2 CGFloat scale = [[UIScreen mainScreen].scale];
3 CGFloat width = rect.size.width * scale;
CGFloat height = rect.size.height * scale;
1.4 設備震動
需要加入AudioToolboxframework,導入頭文件 #import<AudioToolbox/AudioToolbox.h>
在需要震動的地方添加代碼:
4 AudioServicesPlaySystemSound ( kSystemSoundID_Vibrate) ;
但是貌似這個不支持傳入震動時間和模式,自己去控制吧。
1.5 獲取電池的相關信息
@implementation BatterMonitor
//獲取電池當前的狀態,共有4種狀態
-(NSString*) getBatteryState {
UIDevice *device = [UIDevice currentDevice];
if (device.batteryState == UIDeviceBatteryStateUnknown) {
return @"UnKnow";
}else if (device.batteryState == UIDeviceBatteryStateUnplugged){
return @"Unplugged";
}else if (device.batteryState == UIDeviceBatteryStateCharging){
return @"Charging";
}else if (device.batteryState == UIDeviceBatteryStateFull){
return @"Full";
}
return nil;
}
//獲取電量的等級,0.00~1.00
-(float) getBatteryLevel {
return [UIDevice currentDevice].batteryLevel;
}
-(void) getBatteryInfo
{
NSString *state = getBatteryState();
float level = getBatteryLevel()*100.0;
//yourControlFunc(state, level); //寫自己要實現的獲取電量信息後怎麼處理
}
//打開對電量和電池狀態的監控,類似定時器的功能
-(void) didLoad
{
[[UIDevice currentDevice] setBatteryMonitoringEnable:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getBatteryInfo:) name:UIDeviceBatteryStateDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getBatteryInfo:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
[NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(getBatteryInfo:) userInfo:nil repeats:YES];
}
@end
2 運營商信息CoreTelephony
2.1 獲取運行商的名稱
需要先導入頭文件
5 #import <CoreTelephony/CTCarrier.h>
6 #import <CoreTelephony/CTTelephonyNetworkInfo.h>
創建對象
1 CCTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
1 CTCarrier *carrier = [info subscriberCellularProvider];
2 NSString *mCarrier = [NSString stringWithFormat:@"%@",[carrier carrierName]];
2.2 獲取當前網絡的類型
ios7之後可以按照以下方式獲取。方便而且類型多
1 NSString *mConnectType = [[NSString alloc] initWithFormat:@"%@",info.currentRadioAccessTechnology];
類型有以下:
1 CTRadioAccessTechnologyGPRS //介於2G和3G之間,也叫2.5G ,過度技術
2 CTRadioAccessTechnologyEdge //EDGE爲GPRS到第三代移動通信的過渡,EDGE俗稱2.75G
3 CTRadioAccessTechnologyWCDMA
4 CTRadioAccessTechnologyHSDPA //亦稱爲3.5G(3?G)
5 CTRadioAccessTechnologyHSUPA //3G到4G的過度技術
6 CTRadioAccessTechnologyCDMA1x //3G
7 CTRadioAccessTechnologyCDMAEVDORev0 //3G標準
8 CTRadioAccessTechnologyCDMAEVDORevA
9 CTRadioAccessTechnologyCDMAEVDORevB
10 CTRadioAccessTechnologyeHRPD //電信使用的一種3G到4G的演進技術, 3.75G
11 CTRadioAccessTechnologyLTE //接近4G
ios7之前的話apple給我們提供了Reachability來獲取。
首先要導入SystemConfiguration.framework,把下載下來的Reachability.h和Reachability.m加進項目中
1 Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
2 switch([reach currentReachabilityStatus])
3 {
4 case NotReachable: //沒有連接上
5 //do something
6 break;
7 case ReachableViaWiFi: //通過wifi連接
8 //do something
9 break;
10 case ReachableViaWWAN: //通過GPRS連接
11 //do something
12 break;
13 default: <span style="white-space:pre"> </span>//未知情況
14 //do something
15 break;
16 }
http://blog.csdn.net/qijianli/article/details/19922653 這個博客還說了其它的方法,不過因爲是調用私有API,所以沒有采用。
2.3 獲取當前信號的強弱
這個貌似沒有給出官方的api,但是網上有人說可以用私有的api實現,但是通不過appStore的審覈,方法如下:
利用linux下動態庫顯式調用api的函數。先包含頭文件 #import<dlfcn.h>
1 (int) getSignalLevel
2 {
3 voidvoid *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);//獲取庫句柄
4 int (*CTGetSignalStrength)(); //定義一個與將要獲取的函數匹配的函數指針
5 CTGetSignalStrength = (int(*)())dlsym(libHandle,"CTGetSignalStrength"); //獲取指定名稱的函數
6
7 if(CTGetSignalStrength == NULL)
8 return -1;
9 else{
10 int level = CTGetSignalStrength();
11 dlclose(libHandle); //切記關閉庫
12 return level
13 }
14 }
3 NSBundle
bundle是一個目錄,其中包含了程序會使用到的資源.這些資源包含了如圖像,聲音,編譯好的代碼,nib文件(用戶也會把bundle稱爲plug-in). 對應bundle,cocoa提供了類NSBundle.一個應用程序看上去和其他文件沒有什麼區別. 但是實際上它是一個包含了nib文件,編譯代碼,以及其他資源的目錄.我們把這個目錄叫做程序的main bundle。通過這個路徑可以獲取到應用的信息,例如應用名、版本號等。
//app應用相關信息的獲取
NSDictionary *dicInfo = [[NSBundle mainBundle] infoDictionary];
// CFShow(dicInfo);
NSString *strAppName = [dicInfo objectForKey:@"CFBundleDisplayName"];
NSLog(@"App應用名稱:%@", strAppName);
NSString *strAppVersion = [dicInfo objectForKey:@"CFBundleShortVersionString"];
NSLog(@"App應用版本:%@", strAppVersion);
NSString *strAppBuild = [dicInfo objectForKey:@"CFBundleVersion"];
NSLog(@"App應用Build版本:%@", strAppBuild);
4 NSLocale
NSLocale可以獲取用戶的本地化信息設置,例如貨幣類型,國家,語言,數字,日期格式的格式化,提供正確的地理位置顯示等等。下面的代碼獲取機器當前語言和國家代碼。
//Getting the User’s Language
NSArray *languageArray = [NSLocale preferredLanguages];
NSString *language = [languageArray objectAtIndex:0];
NSLog(@"語言:%@", language);//en
NSLocale *locale = [NSLocale currentLocale];
NSString *country = [locale localeIdentifier];
NSLog(@"國家:%@", country); //en_US
5 參考鏈接
ios獲取設備系統信息
http://blog.sina.com.cn/s/blog_9693f61a01017h0k.html
iOS學習筆記(十三)——獲取手機信息(UIDevice、NSBundle、NSLocale)
http://blog.csdn.net/xyz_lmn/article/details/8968196
ios獲取設備信息總結
http://blog.csdn.net/decajes/article/details/41807977