日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的iPhone使用CoreTelephony获得SIM卡网络运营商资讯和通话资料的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。