zoukankan      html  css  js  c++  java
  • iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

    前言:

      在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验.

    但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也分为2G/3G/4G等不同制式.而不同的网络制式又对用户体验产生

    较为明显的影响(对于依赖网络的项目而言).因此很有必要对不同的网络制式作相应的优化.

      而在iOS当中,无论是苹果官方提供的Reachability类还是较为常用的第三方网络类AFNetworking,它们提供的网络环境判断也仅限

    于WIFI/数据,因此我们需要其他方式去获得客户端更详细的网络环境.

      CoreTelephony.framework中提供了CTTelephonyNetworkInfo这个类.这个类是iOS7以后才出现的,在使用这个类之前我们需要

    导入CoreTelephony.framework

    然后在工程中导入相应地.h文件

    #import <CoreTelephony/CTTelephonyNetworkInfo.h>  //为判断网络制式的主要文件
    #import <CoreTelephony/CTCarrier.h> //添加获取客户端运营商 支持

    实现代码如下:

     CTTelephonyNetworkInfo *networkStatus = [[CTTelephonyNetworkInfo alloc]init];  //创建一个CTTelephonyNetworkInfo对象
     NSString *currentStatus  = networkStatus.currentRadioAccessTechnology; //获取当前网络描述

    通过该类的.h文件可以看到.有以下的描述信息:

    /*
     * Radio Access Technology values
     */
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS          __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge          __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA         __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA         __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA         __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x        __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD         __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
    CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE           __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

    其实这些都是我们比较熟悉的网络制式类型了.取到这些描述信息后,我们就可以用他们来做判断了..

        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyGPRS"]){
            //GPRS网络
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyEdge"]){
            //2.75G的EDGE网络
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyWCDMA"]){
            //3G WCDMA网络
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSDPA"]){
            //3.5G网络
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSUPA"]){
            //3.5G网络
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMA1x"]){
            //CDMA2G网络
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORev0"]){
            //CDMA的EVDORev0(应该算3G吧?)
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevA"]){
            //CDMA的EVDORevA(应该也算3G吧?)
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevB"]){
            //CDMA的EVDORev0(应该还是算3G吧?)
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyeHRPD"]){
            //HRPD网络
            return;
        }
        if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyLTE"]){
            //LTE4G网络
            return;
        }

    别看代码多..其实都一个样,只是状态比较多而已.

    而我们取2G/3G/4G的话..就不停的判断吧

    取运营商名字:

    //用回上面的对象
    currentStatus.subscriberCellularProvider.carrierName

    这里也做了个DEMO,基于AFNetworking的判断,可以判断 有无网络,WIFI网络,移动数据网络 (主要描述写在NetworkStatusMonitor.h)

    调用方法:

        [NetworkStatusMonitor StartWithBlock:^(NSInteger NetworkStatus) {
            //NetworkStatus为枚举值
        }];

    http://download.csdn.net/detail/nicky2k8/8605057  DEMO在这里下咯..

  • 相关阅读:
    APIO2018 题解
    【THUWC2017】在美妙的数学王国中畅游(bzoj5020)
    【bzoj3270】博物馆
    【库存】NOI笔试习题集
    装饰器
    异常
    类的详解
    函数
    流程控制
    运算符
  • 原文地址:https://www.cnblogs.com/n1ckyxu/p/4435579.html
Copyright © 2011-2022 走看看