iOS獲取裝置全域性資訊方法總結(如訊號,電量,裝置標示)
iOS獲取裝置全域性資訊方法總結
為系統建立一個隨機的標示符
(NSString*) createUUID
{
NSString *id = [[NSUserDefaults standardUserDefaults] objectForKey:@"UUID"]; //獲取標識為"UUID"的值
if(id == nil)
{
if([[[UIDevice currentDevice] systemVersion] floatValue] > 6.0)
{
NSString *identifierNumber = [[NSUUID UUID] UUIDString]; //ios 6.0 之後可以使用的api
[[NSUserDefaults standardUserDefaults] setObject:identifierNumber forKey:@"UUID"]; //儲存為UUID
[[NSUserDefaults standardUserDefaults] synchronize];
}
else{
CFUUIDRef uuid = CFUUIDCreate(NULL );
CFStringRef uuidString = CFUUIDCreateString(NULL, uuid); //ios6.0之前使用的api
NSString *identifierNumber = [NSString stringWithFormat:@"%@", uuidString];
[[NSUserDefaults standardUserDefaults] setObject:identifierNumber forKey:@"UUID"];
[[NSUserDefaults standardUserDefaults] synchronize];
CFRelease(uuidString);
CFRelease(uuid);
}
return [[NSUserDefaults standardUserDefaults] [email protected]"UUID"];
}
return id;
}
1、獲取裝置的資訊
UIDevice *device = [[UIDevice alloc] int];
NSString *name = device.name; //獲取裝置所有者的名稱
NSString *model = device.name; //獲取裝置的類別
NSString *type = device.localizedModel; //獲取本地化版本
NSString *systemName = device.systemName; //獲取當前執行的系統
NSString *systemVersion = device.systemVersion;//獲取當前系統的版本
獲取裝置的唯一標示符
NSString *identifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
4、獲取當前螢幕解析度的資訊
CGRect rect = [[UIScreen mainScreen] bounds];
CGFloat scale = [[UIScreen mainScreen].scale];
CGFloat width = rect.size.width * scale;
CGFloat height = rect.size.height * scale;
5、獲取運營商的資訊
需要先匯入標頭檔案
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
建立物件
CCTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = [info subscriberCellularProvider];
NSString *mCarrier = [NSString stringWithFormat:@"%@",[carrier carrierName]];
獲取當前網路的型別
ios7之後可以按照以下方式獲取。方便而且型別多
NSString *mConnectType = [[NSString alloc] initWithFormat:@"%@",info.currentRadioAccessTechnology];
型別有以下:
CTRadioAccessTechnologyGPRS //介於2G和3G之間,也叫2.5G ,過度技術
CTRadioAccessTechnologyEdge //EDGE為GPRS到第三代行動通訊的過渡,EDGE俗稱2.75G
CTRadioAccessTechnologyWCDMA
CTRadioAccessTechnologyHSDPA //亦稱為3.5G(3?G)
CTRadioAccessTechnologyHSUPA //3G到4G的過度技術
CTRadioAccessTechnologyCDMA1x //3G
CTRadioAccessTechnologyCDMAEVDORev0 //3G標準
CTRadioAccessTechnologyCDMAEVDORevA
CTRadioAccessTechnologyCDMAEVDORevB
CTRadioAccessTechnologyeHRPD //電信使用的一種3G到4G的演進技術, 3.75G
CTRadioAccessTechnologyLTE //接近4G
ios7之前的話apple給我們提供了Reachability來獲取。
首先要匯入SystemConfiguration.framework,把下載下來的Reachability.h和Reachability.m加進專案中(Reachability.h和Reachability.m見之前的部落格,自己寫了一個demo,可以下載下來用)
Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
switch([reach currentReachabilityStatus])
{
case NotReachable: //沒有連線上
//do something
break;
case ReachableViaWiFi: //通過wifi連線
//do something
break;
case ReachableViaWWAN: //通過GPRS連線
//do something
break;
default: <span style="white-space:pre"> </span>//未知情況
//do something
break;
}
6、獲取當前訊號的強弱
這個貌似沒有給出官方的api,但是網上有人說可以用私有的api實現,但是通不過appStore的稽核,方法如下:
利用Linux下動態庫顯式呼叫api的函式。先包含標頭檔案 #import <dlfcn.h>
-(int) getSignalLevel
{
void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);//獲取庫控制代碼
int (*CTGetSignalStrength)(); //定義一個與將要獲取的函式匹配的函式指標
CTGetSignalStrength = (int(*)())dlsym(libHandle,"CTGetSignalStrength"); //獲取指定名稱的函式
if(CTGetSignalStrength == NULL)
return -1;
else{
int level = CTGetSignalStrength();
dlclose(libHandle); //切記關閉庫
return level;
}
}
7、裝置震動
需要加入AudioToolbox framework,匯入標頭檔案 #import <AudioToolbox/AudioToolbox.h>
在需要震動的地方新增程式碼:
AudioServicesPlaySystemSound ( kSystemSoundID_Vibrate) ;
但是貌似這個不支援傳入震動時間和模式,自己去控制吧。
8、獲取電池的相關資訊
@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
9、app中開啟一個網頁
這個比較簡單,直接用提供的介面openURL即可。
NSString *url = @"www.apple.com"
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
10、app中開啟另一個app
開啟另一個app還是可以通過openURL來實現。但是要分兩種情況。第一種是啟動內建的應用,一般的電話,瀏覽器,簡訊和
郵件可以直接呼叫並新增引數,譬如
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://10086"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://[email protected]"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://10086"]];
第二種情況是要開啟自己開發的app,這種情況則要為將要開啟的app註冊一個URL協議。這個可以在專案的檔案info.plist中註冊。主要操作為:
Step1. 右鍵,選擇“Add Row”
Step2. Key值選擇“URL types”
Step3. 開啟“Item 0″,然後為該key增加一個URL identifier。可以是任何值,但建議用“反域名”(例如 “com.fcplayer.testHello”)。
Step4. 在“Item 0”下再加一行。
Step5. 選擇“URL Schemes” 作為Key。
Step6. 輸入你的URL協議名 (例如“testHello://” 應寫做“testHello”)。如果有必要,你可以在這裡加入多個協議。
其實在開啟的時候只需要URL Schemes即可,URL identifier是可選項。如果需要傳送引數,可以在URL Schemes://新增你的引數,格式和網頁開發的傳遞引數差不多。(又或者URL Schemes://URL [email protected]新增的引數)關鍵是要和接收引數方定義好處理的方式。然後在需要開啟的地方新增程式碼:
NSString *url = @"URL Schemes的路徑"
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];