zoukankan      html  css  js  c++  java
  • 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

     
  • 相关阅读:
    C++ 获取ms级的计时
    基于UDP的IP对IP的客户端程序
    stm32 keil生成bin文件
    xmos 加密
    DMX512程序介绍
    WS2812原理及实现
    MFC 通过按钮调用自对话框 给按钮加载位图 给对话框添加背景
    4*4矩阵键盘FPGA扫描实现
    FIFO
    Modelsim建立UVM环境
  • 原文地址:https://www.cnblogs.com/wudan7/p/3587889.html
Copyright © 2011-2022 走看看