返回目录

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

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

 

iOS:关于获取网络类型和运营商信息的更多相关文章

  1. ios如何获取手机的网络状态和运营商名称

    本文转载至 http://blog.csdn.net/justinjing0612/article/details/38313747 以前获取手机的网络状态和运营商名称都是似有API, 现在我们可以大 ...

  2. iOS获取网络类型的四种方法

    Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有 ...

  3. MTK Android 读取SIM卡参数,获取sim卡运营商信息

    android 获取sim卡运营商信息(转)   TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TE ...

  4. Windows Phone 同步方式获取网络类型

    原文:Windows Phone 同步方式获取网络类型 在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API ...

  5. Android 获取网络类型

    获取网络类型 public class IntenetUtil { //没有网络连接 public static final int NETWORN_NONE = 0; //wifi连接 public ...

  6. js获取浏览器类型和版本信息

    bro () { let broName = 'Runing' let strStart = 0 let strStop = 0 let temp = '' let userAgent = windo ...

  7. Android获取网络类型

    public static final String NETWORK_CLASS_UNKNOWN = "unknown"; public static final String N ...

  8. Android检测网络是否可用并获取网络类型

    在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu ...

  9. Windows Phone 获取网络类型(GSM/CDMA/WIFI/Ethernet)

    一.判断是否有网络数据连接: 最基本的网络状态判断,如果没有网络连接,一切操作都进行不下去啦. Microsoft.Phone.Net.NetworkInformation.NetworkInterf ...

随机推荐

  1. 对于Maven管理的项目制定虚拟目录

    基于Maven管理的web项目结构: target目录是用来存放项目打包之后生成的文件的目录,此目录中的文件必须调用mvn clean package后才能生成, 如果把虚拟目录设置在此目录中,则每次 ...

  2. Android 解决调用系统相册打不开图片 DecodeServices报解码错误

    这是由于系统相册不知道你图片目录是一个相册.打开前需要向系统相册“注册一下”,说白了就是让系统相册知道你这个图片所在的文件夹是个相册. private static void scanImageFil ...

  3. build/core/config.mk

    # 如果定义了ANDROID_BUILD_SHELL,则ANDROID_BUILD_SHELL # 否则使用默认的/bin/bash ifdef ANDROID_BUILD_SHELL SHELL : ...

  4. java.io.EOFException错误

    TOmcat启动后报:IOException while loading persisted sessions: Java.io.EOFException错误 - IOException while ...

  5. JAVA 循环在一个数字前面填充0.小例子

    输入结果 00000000000567 String bala="567"; 固定长度是14位,怎么循环在bala前面填充00000000000 System.out.printl ...

  6. java反射的应用+mybatis+spring动态生成数据库表

    最近接触了一个类似于代码生成工具的活.思路是,通过java的反射机制得到类的字段和字段类型, 从而可以创建一个map集合存储表名(由类名决定的特殊结构字符串),表字段(由类变量确定),表字段类型(由变 ...

  7. .NET 统一用户管理 -- 单点登录

    单点登录 前言 本篇做为.Net 统一用户管理的系列文章的开山之作,主要说一个单点登录是怎么实现的,以及为啥要统一用户管理. 单点登录(Single Sign On),简称为 SSO,是目前比较流行的 ...

  8. Windows Azure 试用 for 世纪互联运维

    前一段时间申请由世纪互联运维的和谐版Windows Azure的邀请嘛下来,今天花费了点时间注册了一下 注册邀请函, 根据提示输入邀请码之后会收到以下邮件 中国地区可选择建立的虚拟机,SQL Serv ...

  9. LINQ 多条件写法

    源代码: string depAll = (ddl_dep1.SelectedValue == "") ? "" : ddl_dep1.SelectedValu ...

  10. Oracle 检验身份证是否正确的存储过程

    ) ) ); ); ); ); ); ); ); ; , , , , , , , , , , , , , , , , , ); ;  , ) );  ..  loop )) ) ); , )), ), ...