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


  • 相关阅读:
    怎样理解 display:none 和 visibility:hidden
    怎样设置鼠标悬浮时弹出的文字提示框内容
    怎样获取当前元素节点的语言类型
    怎样控制元素节点的是否可拖动属性
    怎样读写分配给当前元素的快捷键
    怎样获取元素节点的标签名称
    怎样查看或修改元素节点的id属性
    怎样使用js将文本复制到系统粘贴板中
    怎样创建一个子树遍历器
    怎样创建一个子节点遍历器
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879739.html
Copyright © 2011-2022 走看看