返回目錄
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也在列表中,如下圖: