一、使用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也在列表中,如下圖:
(上圖截取自 http://en.wikipedia.org/wiki/Mobile_country_code )