注意要加头文件目录 /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。


iPhone使用CoreTelephony获得SIM卡网络运营商资讯和通话资料的更多相关文章

  1. 判断 iPhone 是否已插入 SIM 卡的方法

    判断 iPhone 是否插入了 SIM 卡,可以参考苹果官网的 systemconfigure framework 教程,将下面的代码复制到头文件 extern NSString* const kCT ...

  2. android中判断sim卡状态和读取联系人资料的方法

    在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. Pho ...

  3. 十九、android中判断sim卡状态和读取联系人资料的方法

    在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. Pho ...

  4. iphone获取sim卡信息

    /* iphone获取sim卡信息 1.加入一个Framework(CoreTelephony.framework). 2.引入头文件 #import <CoreTelephony/CTTele ...

  5. 手机SIM卡知识大科普

    SIM卡 SIM卡是(Subscriber Identity Module 客户识别模块)的缩写,也称为智能卡.用户身份识别卡,GSM数字移动电话机必须装上此卡方能使用.它在一电脑芯片上存储了数字移动 ...

  6. SIM卡是什么意思?你所不知道的SIM卡知识扫盲(详解)【转】

    原文链接:http://www.jb51.net/shouji/359262.html 日常我们使用手机,SIM卡是手机的必须,没有了它就不能接入网络运营商进行通信服务.SIM卡作为网络运营商对于我们 ...

  7. 利用电话管理器TelephonyManager获取网络和SIM卡信息

    import java.util.ArrayList;import java.util.HashMap;import java.util.Map; import android.os.Bundle;i ...

  8. 【工具类】获取手机sim卡的运营商

    加入权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> package ...

  9. Android ExpandableListView使用+获取SIM卡状态信息

    ExpandableListView 是一个可以实现下拉列表的控件,大家可能都用过QQ,QQ中的好友列表就是用ExpandableListView实现的,不过它是自定义的适配器.本篇 博客除了要介绍E ...

随机推荐

  1. 赛后总结——codeforces round 551 div2

    传送门:QAQQAQ 好歹这次比赛打进前1000了...但第一题WA掉也是醉了... 每次比赛刚开始都是太心急,第一题写的特别快,不经过任何检查,结果最近两次比赛都死在了A题上... A题一上来把n, ...

  2. Shield 安装与配置

    Shield 安装与配置   https://www.elastic.co/guide/en/shield/shield-1.3/introduction.html  一.简介 Shield是Elas ...

  3. drools跳转出现错误问题(400)

    400 Sorry, a technical error occurred. Please contact a system administrator. 今天drools的管理平台tomcat部署完 ...

  4. thymeleaf报错元素类型必须由匹配的结束标记终止

    spring boot 1.x 版本中thymeleaf报错元素类型 “link” 必须由匹配的结束标记 “</link>” 终止解决办法: 1.在pom.xml文件中添加: <de ...

  5. ajaxStart 和 ajaxSend 不执行

    我们一般会在loading 效果的时候会用上这两个全局事件 ajaxStart 和 ajaxSend 但是要注意的是 在同时有多个ajax 执行的时候ajaxStart 只会执行一次 所以一般情况下 ...

  6. HZOI20190818模拟25题解

    题面:https://www.cnblogs.com/Juve/articles/11372379.html A:字符串 其实是CATALAN数水题... 和网格一毛一样:https://www.cn ...

  7. Linux清除磁盘上的RAID信息(Disk /dev/mapper/ddf1_4c53492....)

    本文摘自https://www.cnblogs.com/blkqyd/p/7011104.html自学留存 原因: 这是因为硬盘带有raid信息,拿二手硬盘插入服务器时,系统会根据残留的信息自动发现r ...

  8. java swing+socket实现多人聊天程序

    swing+socket实现多人聊天程序 1.准备工作 先看效果: 客户端项目结构图: 服务端项目结构图: 2.运行原理 服务端 先开一个线程serverListerner,线程中开启一个Server ...

  9. Maven实战02_Maven的安装和配置

    1:在Windows上安装Maven 本人系统环境:win10  + JDK1.8 + apache-maven-3.3.9 在安装Maven之前,首先要确定你的Java环境是否已经配置好了,你是否已 ...

  10. Python - 集合与元素之集合定义和基本操作方法

    集合(set) 定义:由不同元素组成的集合,集合中是一组无序排列可hash的值(不可变的值)例如数字.字符串.元组,可以作为字典的key 定义集合: # 定义集合 s = {1, 2, 3, 3, 3 ...