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

image

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM