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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

datatables隐藏列设置及获取隐藏列的值

https://blog.csdn.net/bingguang1993/article/details/84649674

wsl2 Ubuntu 18.04 安装 ROS

目录前期准备安装ROS初始化rosdep测试前期准备 WSL的安装见旧版 WSL 的手动安装步骤从步骤4开始弄。 图形界面安装见在WSL中使用GPU:WSL2 Ubuntu 18.04 CUDA Gnome图形界面环境配置 界面汉化见WSL-Ubuntu安装中文语言 这里使用鱼香ROS大佬的一键安装脚本&…

Udi Dahan对于业务逻辑重用以及微服务方面的观点

今年的DDD Exchange大会在伦敦如期举行,Udi Dahan在大会上的一场演讲中从一种不同的角度对业务逻辑进行了剖析。他表示:近三十年来,重用已经成为了一种口号,它几乎可以套用在系统开发中的每一个环节上。但重用其实是一种砒霜&…

微软移除Visual Studio 2015中的UML

微软已经在Visual Studio 2015中移除了UML(Unified Modeling Language,统一建模语言),原因是该语言使用率过低。因此微软要优化产品结构,把好钢用在刀刃上。 Visual Studio高级产品经理Jean-Marc Prieur表示&#xff0…

GPU CUDA 经典入门指南

转自:http://luofl1992.is-programmer.com/posts/38830.html CUDA编程中,习惯称CPU为Host,GPU为Device。编程中最开始接触的东西恐怕是并行架构,诸如Grid、Block的区别会让人一头雾水,我所看的书上所讲述的内容比较抽象…

Jquery创建动态表单

$(document).ready(function(){$("#button1").click(function(){//获取html <body></body>的Jquery对象var body $("body");//创建表单var form $("<form></form>");//将表单放入body中body.append(form);//设置表单各…

用PyQt实现透明桌面时钟小部件

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding: utf-8 -*-Created on 2012-4-6author: wangxiaoimport sys from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt from PyQt4.QtCore import QPoint from PyQt4.QtCore…

实现织梦dedecms百度主动推送(实时)网页抓取

做百度推广的时候&#xff0c;如何让百度快速收录呢&#xff0c;下面提供了三种方式&#xff0c;今天我们主要讲的是第一种。 如何选择链接提交方式 1、主动推送&#xff1a;最为快速的提交方式&#xff0c;推荐您将站点当天新产出链接立即通过此方式推送给百度&#xff0c;以保…

高性能CSS(一)

避免使用import 有两种方式加载样式文件&#xff0c;一种是link元素&#xff0c;另一种是CSS 2.1加入import。而在外部的CSS文件中使用import会使得页面在加载时增加额外的延迟。虽然规则允许在样式中调用import来导入其它的CSS&#xff0c;但浏览器不能并行下载样式&#xff0…

【RK3399Pro学习笔记】十八、点亮LED灯(python、C语言、bash)

目录GPIOpython3python-peripherypython2RPiC语言SysFs方式编写gpiolib.cgpiolib.hmain.c编译测试wiringPibash平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 GPIO (机翻)下表显示了座子的引脚&am…

Jquery - 添加属性、添加class、添加Css

Jquery - 添加属性、添加class、添加Css 一.设置属性&#xff1a; 方式一 jQuery 代码: $("img").attr({ src: "test.jpg", alt: "Test Image" } 方式二&#xff1a;jQuery代码--键值对 $("img").attr("src","te…

PHP笔记——java程序员看懂PHP程序

PHP笔记——java程序员看懂PHP程序 php是一种服务器端脚本语言&#xff0c;类型松散的语言。<?php ?> xml风格<script language”php”></script> 脚本风格 <? ?> 简短风格 <% %> ASP风格 以;结尾&#…

C# mysql 插入数据,中文乱码

用C#操作mysql时&#xff0c; 插入数据中文都是乱码&#xff0c;只显示问号&#xff0c;数据库本身使用的是utf-8字符。网上百度一下有两种解决办法&#xff1a; 一种是在执行语句前面设置&#xff0c;如&#xff1a;MySQLCommand mCommand new MySQLCommand("set names …

C# list与数组互相转换

1. 从System.String[]转到List<System.String>System.String[] str{"str","string","abc"};List<System.String> listSnew List<System.String>(str);2. 从List<System.String>转到System.String[]List<System.Strin…

Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)

目录python3开始学习Python线程_thread常量和函数&#xff1a;锁对象试用基本功能试用线程同步threading函数常量类线程本地数据线程对象锁对象递归锁对象条件对象信号量对象Semaphore 例子事件对象定时器对象栅栏对象在 with 语句中使用锁、条件和信号量测试Cstd::threadstd::…

[原]关于在 iOS 中支持 DLNA

目前国内的视频播放器中&#xff0c;支持 DLNA 播放比较好的是&#xff1a;腾讯视频。 刚才反编了一下他们的代码&#xff0c;发现使用了一个开源库&#xff0c; 地址&#xff1a;https://github.com/FuruyamaTakeshi/DLNA 并且在这个库的基础了做了一层封装&#xff0c;包含如…

Swing-BoxLayout用法-入门

注&#xff1a;本文内容源于http://www.java3z.com/cwbwebhome/article/article20/200016.html?id4797&#xff1b;细节内容根据笔者理解有修改。 BoxLayout 可以把控件依次进行水平或者垂直排列布局&#xff0c;这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列&a…

Python开发利器之UliPad

一、安装Ulipad 因为ulipad编辑器使用的是wxpython编写的gui&#xff0c;所以我们需要第三方库wxpython的支持&#xff0c;先讲一下Ulipad在Windows系统环境下的安装&#xff1a; 1. 确实自己的windows版本&#xff0c;32位还是64位的。2. 查看自己安装的 Python版本&#xff0…

网页中如何使用一些特殊字体

虽然我们可以通过图片&#xff0c;flash、SIFR等技术来实现网页使用特殊字体&#xff0c;有利于SEO网页中嵌入特殊字体方法&#xff0c;font-face属性。 通常网页上不能使用一些特殊字体&#xff0c;否则浏览者可能无法正确浏览到&#xff0c;虽然我们可以通过图片&#xff0c…

Google浏览器中的开发工具.

惯例 我是温浩然: google浏览器&#xff0c;按下F12后&#xff0c;出现开发控制台。 下面有这么几栏&#xff0c;elements,network,sources,timeline ,profiles,resources,audits ,console. elements&#xff0c;是页面源码&#xff0c;network&#xff0c;是看请求的&#xff…