IOS開發系列——設備信息專題【整理,部分原創】

設備信息專題

 

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         //介於2G3G之間,也叫2.5G ,過度技術    

2 CTRadioAccessTechnologyEdge         //EDGEGPRS到第三代移動通信的過渡,EDGE俗稱2.75G   

3 CTRadioAccessTechnologyWCDMA           

4 CTRadioAccessTechnologyHSDPA            //亦稱爲3.5G(3?G)  

5 CTRadioAccessTechnologyHSUPA            //3G4G的過度技術  

6 CTRadioAccessTechnologyCDMA1x       //3G      

7 CTRadioAccessTechnologyCDMAEVDORev0    //3G標準  

8 CTRadioAccessTechnologyCDMAEVDORevA    

9 CTRadioAccessTechnologyCDMAEVDORevB    

10      CTRadioAccessTechnologyeHRPD        //電信使用的一種3G4G的演進技術, 3.75G       

11      CTRadioAccessTechnologyLTE          //接近4G   

 

ios7之前的話apple給我們提供了Reachability來獲取。

首先要導入SystemConfiguration.framework,把下載下來的Reachability.hReachability.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

  

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html

 

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/Reference/Reference.html

 

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html

 

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-accessing-device-data-with-uidevice-and-nslocale/


發佈了44 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章