iOS:關于獲取網絡類型和運營商信息

jopen 10年前發布 | 126K 次閱讀 IOS iOS開發 移動開發

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

30213332-1dd836d164294e1784b48df1f8e9b2d3.png

(上圖截取自http://en.wikipedia.org/wiki/Mobile_country_code
來自:http://www.mgenware.com/blog/?p=487

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!