iPhone開發 判斷當前的網絡

一、使用Reachability判斷WIFI還是3G


http://www.oschina.net/code/snippet_54100_9071


1.添加framework: 
將SystemConfiguration.framework 添加進工程。 
2.下載 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip 
複製裏面的Reachability.h和Reachability.m到項目中


1. [代碼]調用的代碼

01 //判斷當前的網絡是3g還是wifi
02 -(NSString*)GetCurrntNet
03 {
04     NSString* result;
05     Reachability *r = [ReachabilityreachabilityWithHostName:@"www.apple.com"];
06     switch ([r currentReachabilityStatus]) {
07         caseNotReachable:// 沒有網絡連接
08             result=nil;
09             break;
10         caseReachableViaWWAN:// 使用3G網絡
11             result=@"3g";
12             break;
13         caseReachableViaWiFi:// 使用WiFi網絡
14             result=@"wifi";
15             break;
16     }
17     return result;
18 }


二、使用currentRadioAccessTechnology獲取具體的網絡類型:LTE/WCDMA/GPRS等

http://www.tuicool.com/articles/FJzMRn

1. 獲取運營商網絡類型

Apple的 Reachability Sample 看起來不錯,但是只可以判斷是否連接到互聯網和是否連接Wifi,但是無法判斷運營商網絡類型(2G/3G等)。我查到有3種方法實現,前兩種是通過調用私有API,第三種是隻有iOS 7纔有的,公有API,但是沒有文檔。

第一種方法就是嘗試從狀態欄中獲取網絡類型,參考 SO 。

基本原理是從UIApplication類型中通過valueForKey獲取內部屬性statusBar。然後篩選一個內部類型(UIStatusBarDataNetworkItemView),最後返回他的dataNetworkType屬性。(不過貌似有一個缺點是如果狀態欄隱藏了,該方法不會成功,參考上面SO鏈接中的回答部分)。

第二種方法是通過SoftwareUpdateServices.framework中的SUNetworkMonitor類型來獲取,參考 SO鏈接 。同樣也是私有API。

第三種方法是iOS 7中的公有API,在CTTelephonyNetworkInfo類型中,但是現在CTTelephonyNetworkInfo類型的官方文檔 中還沒有相關API的說明。獲知這個API來自一篇非常棒的文章 iOS 7: Hidden Gems and Workarounds

實現起來就是使用CTTelephonyNetworkInfo類型的currentRadioAccessTechnology方法。

在蘋果 iOS 6.1 to iOS 7.0 API Differences 中才提到了上述類型和其相關定義。如下,CTTelephonyNetworkInfo.h中新加入的定義:

Added CTTelephonyNetworkInfo.currentRadioAccessTechnology

Added CTRadioAccessTechnologyCDMA1x

Added CTRadioAccessTechnologyCDMAEVDORev0

Added CTRadioAccessTechnologyCDMAEVDORevA

Added CTRadioAccessTechnologyCDMAEVDORevB

Added CTRadioAccessTechnologyDidChangeNotification

Added CTRadioAccessTechnologyEdge

Added CTRadioAccessTechnologyGPRS

Added CTRadioAccessTechnologyHSDPA

Added CTRadioAccessTechnologyHSUPA

Added CTRadioAccessTechnologyLTE

Added CTRadioAccessTechnologyWCDMA

Added CTRadioAccessTechnologyeHRPD

可以寫一個簡單的示例,需導入CoreTelephony.framework,然後import必要的Header。

#import  <CoreTelephony/CTTelephonyNetworkInfo.h>

輸出當前運營商的網絡類型:

CTTelephonyNetworkInfo  *networkInfo = [[ CTTelephonyNetworkInfo   alloc ] init ];

NSLog ( @"%@" , networkInfo. currentRadioAccessTechnology );

也可以通過在NSNotificationCenter中註冊CTRadioAccessTechnologyDidChangeNotification(宏定義)來監聽狀態改變。

返回目錄

2. 獲取運營商信息

關於獲取運營商信息,需通過CoreTelephony Framework中的CTTelephonyNetworkInfo和CTCarrier類型。這些都在iOS 4.0後就有了。

import必要的header:

#import  <CoreTelephony/CTCarrier.h>

#import  <CoreTelephony/CTTelephonyNetworkInfo.h>

CTCarrier類型代表着具體的運營商信息。調用CTTelephonyNetworkInfo的subscriberCellularProvider方法來獲取當前運營商信息,或者調用subscriberCellularProviderDidUpdateNotifier方法來覺察運營商變化。

獲取了CTCarrier類型,就可以執行從他的屬性中獲取運營商信息了。

目前他有如下屬性:allowsVOIP,carrierName,isoCountryCode,mobileCountryCode ,mobileNetworkCode。參考 官方文檔 。

其中isoCountryCode使用ISO 3166-1標準,參考:http://en.wikipedia.org/wiki/ISO_3166-1

mobileCountryCode(MCC)和mobileNetworkCode(MNC)可以參考:http://en.wikipedia.org/wiki/Mobile_country_code

中國的MCC是460。中國的MNC也在列表中,如下圖:

image

(上圖截取自 http://en.wikipedia.org/wiki/Mobile_country_code )



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章