注意要加头文件目录 /System/Library/Frameworks/CoreTelephony.framework/Headers 到 build 设置 Header Search Paths,并在使用到这些类中加头文件,例如

1. #import "CTCarrier.h"
2. #import "CTTelephonyNetworkInfo.h"

iOS 4.0 的官方 API 里头,多了一个叫做 Core Telephony 的 framework;一直以来 Core Telephony 都是 private API,现在开放出来,但是从文件来看,里头根本没有几行,既没有告诉你应该怎么用,也没有范例,你从 framework 里头寥寥四个 class 的 header 中,也搞不清楚,究竟可以把这个东西用在什么用途上。

目前只知道可以拿来做两件事情:1. 知道目前你这只 iPhone 用的是哪个电信商的服务;2. 知道现在 iPhone 是不是在打电话。

1.SIM卡网络运营商资讯

用 CTTelephonyNetworkInfo 与 CTCarrier 这两个 class,就可以取得电信商资讯。要想获取这些讯息,我们就要先了解下IMSI基本概念:

IMSI 共有 15 位,其结构如下:

   MCC+MNC+MSIN ,( MNC+MSIN=NMSI )

   MCC : Mobile Country Code ,移动国家码, MCC 的资源由国际电联( ITU )统一分配和管理,唯一识别移动用户所属的国家,共 3 位,中国为 460;

   MNC:Mobile Network Code ,移动网络码,共 2 位,中国移动 TD 系统使用 00 ,中国联通 GSM 系统使用 01 ,中国移动 GSM 系统使用 02 ,中国电信 CDMA 系统使用 03 ,一个典型的 IMSI 号码为 460030912121001;

   MSIN:Mobile Subscriber Identification Number 共有 10 位,其结构如下:

   09+M0M1M2M3+ABCD

其中的 M0M1M2M3 和 MDN 号码中的 H0H1H2H3 可存在对应关系, ABCD 四位为自由分配。

这样就可以依据 IMSI 中的 MCC 和 MNC 来确定运营商了。不过IMSI在iOS官方API是暂不支持获取,不过现在又许多开源私有库,具体我也没用过。

链接:http://hi.baidu.com/marktian/item/c674aac28584d753bdef69e0

http://www.devdiv.com/thread-101401-1-1.html

当然知道编码规则同时还是需要知道对应编码的的国家和网络了,可参考下面表格:

我来大概解释下:中国移动MNC(00、02、07)、中国联通MNC(01、06)、中国电信MNC(03、05)、中国铁通(20)NA(未知网络)

示例代码:

CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = info.subscriberCellularProvider;
NSLog(@"carrier:%@", [carrier description]);

//获取MCC(移动国家码)

NSString *mcc = [carrier mobileCountryCode];

//获取MNC(移动网络码)

NSString *mnc = [carrier mobileNetworkCode];

//判断运营商

if ([[mcc substringWithRange:NSMakeRange(0, 3)] isEqualToString:@"460"]) {
      NSInteger MNC = [[mnc substringWithRange:NSMakeRange(0, 2)] intValue];
            switch (MNC) {
                  case 00:
                  case 02:
                  case 07:
                       return @"China Mobile";

case 01:
                  case 06:
                       return @"China Unicom";

case 03:
                  case 05:
                       return @"China Telecom";
                  case 20:
                       return @"China Tietong";
                  default:
                       break;
            }
      }
}

然后,如果你对 CTTelephonyNetworkInfo 喂一个 block 进去,像是:

info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) {NSLog(@"carrier:%@", [carrier description]);};

如 此一来,当你的 iPhone 漫游到了其他网路的时候,就会执行你这段 block,但光是知道手机现在漫游在哪个电信商的网路里头,大概能做的,就是一些跟电信商关系密切的服务之类,你或许可以决定软体里头有哪些功能,一定要在某个电信商的网路才能用;电信商自己做 iPhone 软体的时候大概会想做这种事情。

2.通话资料

用 CTCallCenter 与 CTCall 这两个 class,便可以知道目前 iPhone 是否在通话中。CTCallCenter 的用途是用来监控是不是有电话打进来、正在接听、或是已经挂断,而 CTCall 则是将每一则通话事件 包装成一个物件。我们先写一小段程式-

CTCallCenter *center = [[CTCallCenter alloc] init];
center.callEventHandler = ^(CTCall *call) {
NSLog(@"call:%@", [call description]);
};

然后,在实机上执行,接著打通电话到这支 iPhone 上,打通电话进去,然后马上挂断(人好端端的,干嘛为了测试程式跟自己的电话费帐单过不去呢?)就可以看到 iPhone 执行了我们的 block,把 CTCall 物件倒出来:

CTCall (0x143400) {
callState: [CTCallStateIncoming]
Call ID: [CE5F9337-1990-4254-8797-1CCEA85B061B]
}
CTCall (0x10bac0) {
callState: [CTCallStateDisconnected]
Call ID: [CE5F9337-1990-4254-8797-1CCEA85B061B]
}

CTCall 物件只有两个属性,一是通话状态(来电中、通话中…),二是这则通话的 unique id,除此之外没有其他资讯,你没办法知道这通电话是从哪里打来的,只能知道有电话进来而已,也没办法透过这个 API 打电话出去。

大抵上可以想到的用途,就是当你的程式执行到一半的时候,程式流程被电话打断,这时候就可能要中断原本正在做的事情,在通话结束之后恢复。

最后,CTCallCenter 与 CTTelephonyNetworkInfo,在模拟器上是没有办法用的,呼叫 alloc、init 之后回传的结果只会是 nil。

转载于:https://www.cnblogs.com/zsw-1993/p/4879739.html

iPhone使用CoreTelephony获得SIM卡网络运营商资讯和通话资料相关推荐

  1. [Swift]获取手机SIM卡网络运营商名称

    导入框架 import CoreTelephony 获取当前运营商名称 /// 获取手机SIM卡网络运营商名称 func currentCarrierName() -> String? {var ...

  2. 极客日报:腾讯企业QQ将停运;雷军:小米汽车预计2024年量产;iPhone或将取消SIM卡槽,全部改用eSIM卡

    一分钟速览新闻点! 腾讯企业QQ宣布将停运:2022年1月31日不再提供服务 雷军曝小米动态:数字系列分"一大一小",汽车2024年量产 部分App禁止全部权限仍可获取用户信息 腾 ...

  3. iPhone预计移除SIM卡槽,用户需通过eSIM激活网络

    iPhone不支持双卡双待,是很多国内用户吐槽的点. 如今美国所售卖的双卡iPhone,就是一个实体SIM加上eSIM.据悉,苹果尝试推出没有实体SIM卡的iPhone,可能从iPhone 14机型开 ...

  4. sim卡没坏但苹果手机无服务_苹果 iPhone 突然出现“无 SIM 卡,该怎么办?

    大家都知道,iPhone 这俩年,是出了名的信号不好. 像我每天坐地铁上下班,只能听听歌,想刷视频根本不给你机会. 唉,看着别人上班路上开黑,真的羡慕. 这不今天咆哥也被这个问题难住了. 虽然心里清楚 ...

  5. iPhone判断是否已插入SIM卡

    2019独角兽企业重金招聘Python工程师标准>>> 判断 iPhone 是否插入了 SIM 卡,可以参考苹果官网的 systemconfigure framework 教程,将下 ...

  6. iOS 判断是否安装SIM卡

    转载自 :http://blog.163.com/china_uv/blog/static/11713726720126725415858/ Core Telephony Framework(核心通讯 ...

  7. 苹果8为什么不显示卡的服务器,苹果8手机显示无SIM卡什么原因?iPhone8无SIM卡解决方法...

    不知道大家的苹果手机是否出现这类问题,就是莫名其妙的手机显示无sim卡.有网友询问苹果8手机显示无SIM卡,重启飞行模式设置都试了没用,突然显示无SIM卡,不知道是不是硬件问题?关于iPhone8手机 ...

  8. 什么原因显示sim卡没服务器,苹果手机显示无sim卡是什么原因 苹果手机显示无sim卡解决方法...

    不知道大家的 苹果 手机是否出现这类问题,就是莫名其妙的手机显示无sim卡这是怎么回事呢,大家都知道iphone是结合照相手机个人数码助理以及多媒体播放等等设备的手机,是因为这些齐全的功能导致的sim ...

  9. 苹果手机突然四g不显示无服务器,苹果手机显示无sim卡是什么原因 苹果手机显示无sim卡解决方法...

    不知道大家的 苹果 手机是否出现这类问题,就是莫名其妙的手机显示无sim卡这是怎么回事呢,大家都知道iphone是结合照相手机个人数码助理以及多媒体播放等等设备的手机,是因为这些齐全的功能导致的sim ...

最新文章

  1. DevOps通用及版本控制面试题
  2. mysql语句中变量 c#_C#基础知识-您的第一个C#程序,类型和变量以及流控制语句...
  3. 题目7 街区最短路径问题
  4. 再复杂的报表,用这3种方式,都能解决!
  5. Atitit.获取某个服务 网络邻居列表 解决方案
  6. Unity使用Aspose.Words创建表格和UI截图一起插入到Word中并保存到本地的一种解决方案
  7. php操作剪贴板内容代码,查看剪贴板内容的方法
  8. 英语语法自动矫正(nounplus)
  9. 虚拟机教程(一) 启用win10自带虚拟机
  10. 20170605——login页面(代码知识点分析)
  11. 五行顺口溜_纳音五行口诀
  12. 语法错误 : 缺少“;”(在“类型”的前面)的解决方案
  13. os.environ[‘CUDA_VISIBLE_DEVICES‘]指定GPU后,还是用的“0“卡
  14. 计算机二级等级证书Java考试-模拟试题1
  15. X87 FPU 指令集
  16. Raspberry PI 编译WLan驱动模块, 并配置登录WIFI
  17. 一个简单的Arm开发板的制作过程
  18. 如何修改新增物料,客户,供应商时的默认税率
  19. 各大网站 http server分析
  20. php实现ddns,动态域名DDNS实现

热门文章

  1. yolov4Linux,基于Darknet的YOLOv4目标检测
  2. gitee项目404问题_七款开源项目,让你数据库管理不再成为一个问题
  3. java数_java大数
  4. android 心跳效果动画,Android实现心跳的效果
  5. java js highcharts_Highcharts.js -纯javasctipt图表库初体验
  6. getdate函数_PHP getdate()函数与示例
  7. java中Scanner类中 next()与nextLine()的区别
  8. 线性表----顺序表
  9. yum 安装 sun java,CentOS yum安装sun Java jre jdk和openjdk
  10. -又见GCD -- ACM解决方法