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 )



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值