????????iOS的APP的應(yīng)用開(kāi)發(fā)的過(guò)程中,有時(shí)為了bug跟蹤或者獲取用反饋的需要自動(dòng)收集用戶設(shè)備嘁锯、系統(tǒng)信息请毛、應(yīng)用信息等等志鞍,這些信息方便開(kāi)發(fā)者診斷問(wèn)題,當(dāng)然這些信息是用戶的非隱私信息方仿,是通過(guò)開(kāi)發(fā)api可以獲取到的固棚。那么通過(guò)那些api可以獲取這些信息呢,iOS的SDK中提供了UIDevice仙蚜,NSBundle此洲,NSLocale。
1 UIDevice類(lèi)
????????UIDevice提供了多種屬性委粉、類(lèi)函數(shù)及狀態(tài)通知呜师,幫助我們?nèi)轿涣私庠O(shè)備狀況。從檢測(cè)電池電量到定位設(shè)備與臨近感應(yīng)贾节,UIDevice所做的工作就是為應(yīng)用程序提供用戶及設(shè)備的一些信息汁汗。UIDevice類(lèi)還能夠收集關(guān)于設(shè)備的各種具體細(xì)節(jié),例如機(jī)型及iOS版本等栗涂。其中大部分屬性都對(duì)開(kāi)發(fā)工作具有積極的輔助作用知牌。下面的代碼簡(jiǎn)單的使用UIDevice獲取手機(jī)屬性。
1.1 獲取設(shè)備基本信息
?????UIDevice *device_=[[UIDevice alloc] init];
? ? NSLog(@"設(shè)備所有者的名稱--%@",device_.name);
? ? NSLog(@"設(shè)備的類(lèi)別-----%@",device_.model);
? ? NSLog(@"設(shè)備的的本地化版本-%@",device_.localizedModel);
? ? NSLog(@"設(shè)備運(yùn)行的系統(tǒng)---%@",device_.systemName);
? ? NSLog(@"當(dāng)前系統(tǒng)的版本---%@",device_.systemVersion);
? ? NSLog(@"設(shè)備唯一識(shí)別碼-----%@",device_.identifierForVendor.UUIDString);
? ? //得到設(shè)備屏幕高度
? ? float screenHeight=[UIScreen mainScreen].bounds.size.height;
打印結(jié)果如下
2013-03-08 17:31:13.944
WaiMai[14982:907] 設(shè)備所有者的名稱--“zhangqingfeng”的 iPhone
2013-03-08 17:31:13.951
WaiMai[14982:907] 設(shè)備的類(lèi)別-----iPhone
2013-03-08 17:31:13.953
WaiMai[14982:907] 設(shè)備的的本地化版本-iPhone
2013-03-08 17:31:13.957
WaiMai[14982:907] 設(shè)備運(yùn)行的系統(tǒng)---iPhone OS
2013-03-08 17:31:13.961
WaiMai[14982:907] 當(dāng)前系統(tǒng)的版本---6.0.1
2013-03-08 17:31:13.969
WaiMai[14982:907] 設(shè)備識(shí)別碼-----7305AFE8-66C0-4C6B-8173-1AA61E9F837D
2013-03-08 17:31:14.178 WaiMai[14982:1703]?
1.2 獲取設(shè)備的唯一標(biāo)示符
NSString?*identifier?=?[[[UIDevice?currentDevice]?identifierForVendor]?UUIDString];??
1.3 獲取當(dāng)前屏幕分辨率的信息
CGRect?rect?=?[[UIScreen?mainScreen]?bounds];
CGFloat?scale?=?[[UIScreen?mainScreen].scale];
CGFloat?width?=?rect.size.width?*?scale;
CGFloat?height?=?rect.size.height?*?scale;??
1.4 設(shè)備震動(dòng)
????????需要加入AudioToolbox.framework,導(dǎo)入頭文件#import<AudioToolbox/AudioToolbox.h>斤程,在需要震動(dòng)的地方添加代碼:
AudioServicesPlaySystemSound?(?kSystemSoundID_Vibrate)?;
????????但是貌似這個(gè)不支持傳入震動(dòng)時(shí)間和模式角寸,自己去控制吧。
1.5 獲取電池的相關(guān)信息
@implementation?BatterMonitor
//獲取電池當(dāng)前的狀態(tài)忿墅,共有4種狀態(tài)
- (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;
}
//獲取電量的等級(jí)扁藕,0.00~1.00
- (float)?getBatteryLevel?{
????return?[UIDevice?currentDevice].batteryLevel;
}
-(void)?getBatteryInfo
{
????NSString*state?=?getBatteryState();
????floatlevel?=?getBatteryLevel()*100.0;
????//yourControlFunc(state,?level);??//寫(xiě)自己要實(shí)現(xiàn)的獲取電量信息后怎么處理
}
//打開(kāi)對(duì)電量和電池狀態(tài)的監(jiān)控,類(lèi)似定時(shí)器的功能
-(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 運(yùn)營(yíng)商信息CoreTelephony
2.1 獲取運(yùn)行商的名稱
需要先導(dǎo)入頭文件
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
創(chuàng)建對(duì)象
CCTelephonyNetworkInfo?*info?=?[[CTTelephonyNetworkInfo?alloc]?init];
CTCarrier?*carrier?=?[info?subscriberCellularProvider];
NSString?*mCarrier?=?[NSString?stringWithFormat:@"%@",[carrier?carrierName]];
2.2 獲取當(dāng)前網(wǎng)絡(luò)的類(lèi)型
ios7之后可以按照以下方式獲取疚脐。方便而且類(lèi)型多
NSString?*mConnectType?=?[[NSString?alloc]?initWithFormat: @"%@", info.currentRadioAccessTechnology];
類(lèi)型有以下:
????1亿柑、CTRadioAccessTechnologyGPRS?????????//介于2G和3G之間,也叫2.5G?,過(guò)度技術(shù)??
????2亮曹、CTRadioAccessTechnologyEdge?????????//EDGE為GPRS到第三代移動(dòng)通信的過(guò)渡橄杨,EDGE俗稱2.75G?
????3秘症、CTRadioAccessTechnologyWCDMA
????4、CTRadioAccessTechnologyHSDPA????????????//亦稱為3.5G(3?G)
????5式矫、CTRadioAccessTechnologyHSUPA????????????//3G到4G的過(guò)度技術(shù)
????6乡摹、CTRadioAccessTechnologyCDMA1x???????//3G????
????7、CTRadioAccessTechnologyCDMAEVDORev0????//3G標(biāo)準(zhǔn)
????8采转、CTRadioAccessTechnologyCDMAEVDORevA
????9聪廉、CTRadioAccessTechnologyCDMAEVDORevB
????10、CTRadioAccessTechnologyeHRPD????????//電信使用的一種3G到4G的演進(jìn)技術(shù)故慈,?3.75G?????
????11板熊、CTRadioAccessTechnologyLTE??????????//接近4G?
????ios7之前的話apple給我們提供了Reachability來(lái)獲取。
????首先要導(dǎo)入SystemConfiguration.framework察绷,把下載下來(lái)的Reachability.h和Reachability.m加進(jìn)項(xiàng)目中干签。
Reachability?*reach?=?[Reachability?reachabilityWithHostName:@"www.apple.com"];
switch ([reach?currentReachabilityStatus])
{
????case?NotReachable:??//沒(méi)有連接上
????????//do?something
????????break;
????case?ReachableViaWiFi:??//通過(guò)wifi連接
????????//do?something
????????break;
????case?ReachableViaWWAN:??//通過(guò)GPRS連接
????????//do?something
????????break;
????default:????????//未知情況
????????//do?something
????????break;
}
http://blog.csdn.net/qijianli/article/details/19922653?這個(gè)博客還說(shuō)了其它的方法,不過(guò)因?yàn)槭钦{(diào)用私有API拆撼,所以沒(méi)有采用容劳。
2.3 獲取當(dāng)前信號(hào)的強(qiáng)弱
????????這個(gè)貌似沒(méi)有給出官方的api,但是網(wǎng)上有人說(shuō)可以用私有的api實(shí)現(xiàn)闸度,但是通不過(guò)appStore的審核竭贩,方法如下:
????????利用linux下動(dòng)態(tài)庫(kù)顯式調(diào)用api的函數(shù)。先包含頭文件#import<dlfcn.h>
-(int)?getSignalLevel
{
????void?*libHandle?=?dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);//獲取庫(kù)句柄
????int?(*CTGetSignalStrength)();?//定義一個(gè)與將要獲取的函數(shù)匹配的函數(shù)指針
????CTGetSignalStrength?=?(int(*)())dlsym(libHandle,"CTGetSignalStrength");?//獲取指定名稱的函數(shù)
????if (CTGetSignalStrength?==?NULL)
????????return -1;
????else{
????????int level?=?CTGetSignalStrength();
????????dlclose(libHandle);?//切記關(guān)閉庫(kù)
????????return level
????}
}??
3 NSBundle
????????bundle是一個(gè)目錄,其中包含了程序會(huì)使用到的資源.這些資源包含了如圖像,聲音,編譯好的代碼,nib文件(用戶也會(huì)把bundle稱為plug-in). 對(duì)應(yīng)bundle,cocoa提供了類(lèi)NSBundle.一個(gè)應(yīng)用程序看上去和其他文件沒(méi)有什么區(qū)別.但是實(shí)際上它是一個(gè)包含了nib文件,編譯代碼,以及其他資源的目錄.我們把這個(gè)目錄叫做程序的main bundle莺禁。通過(guò)這個(gè)路徑可以獲取到應(yīng)用的信息留量,例如應(yīng)用名、版本號(hào)等哟冬。
//app應(yīng)用相關(guān)信息的獲取
NSDictionary?*dicInfo?=?[[NSBundle?mainBundle]?infoDictionary];
//????CFShow(dicInfo);
NSString?*strAppName?=?[dicInfo?objectForKey:@"CFBundleDisplayName"];
NSLog(@"App應(yīng)用名稱:%@",?strAppName);
NSString?*strAppVersion?=?[dicInfo?objectForKey:@"CFBundleShortVersionString"];
NSLog(@"App應(yīng)用版本:%@",?strAppVersion);
NSString?*strAppBuild?=?[dicInfo?objectForKey:@"CFBundleVersion"];
NSLog(@"App應(yīng)用Build版本:%@",?strAppBuild);?
4 NSLocale
????????NSLocale可以獲取用戶的本地化信息設(shè)置楼熄,例如貨幣類(lèi)型,國(guó)家柒傻,語(yǔ)言孝赫,數(shù)字较木,日期格式的格式化红符,提供正確的地理位置顯示等等。下面的代碼獲取機(jī)器當(dāng)前語(yǔ)言和國(guó)家代碼伐债。
//Getting?the?User’s?Language
NSArray?*languageArray?=?[NSLocale?preferredLanguages];
NSString?*language?=?[languageArray?objectAtIndex:0];
NSLog(@"語(yǔ)言:%@",?language);//en
NSLocale?*locale?=?[NSLocale?currentLocale];
NSString?*country?=?[locale?localeIdentifier];
NSLog(@"國(guó)家:%@",?country);?//en_US?
5 參考鏈接
ios獲取設(shè)備系統(tǒng)信息
http://blog.sina.com.cn/s/blog_9693f61a01017h0k.html
iOS學(xué)習(xí)筆記(十三)——獲取手機(jī)信息(UIDevice预侯、NSBundle、NSLocale)
http://blog.csdn.net/xyz_lmn/article/details/8968196
ios獲取設(shè)備信息總結(jié)
http://blog.csdn.net/decajes/article/details/41807977
iOS獲取運(yùn)營(yíng)商信息(IMSI)