iOS 4.0 的官方 API 裡頭,多了一個叫做 Core Telephony 的 framework;一直以來 Core Telephony 都是 private API,現在開放出來,但是從文件來看,裡頭根本沒有幾行,既沒有告訴你應該怎麼用,也沒有範例,你從 framework 裡頭寥寥四個 class 的 header 中,也搞不清楚,究竟可以把這個東西用在什麼用途上。
Iphone如何判断当前网络的运营商
+ (BOOL)checkChinaMobile
{
BOOL ret =NO;
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc]init];
CTCarrier *carrier = [info subscriberCellularProvider];
if (carrier ==nil) {
[info release];
return NO;
}
NSString *code = [carrier mobileNetworkCode];
if (code ==nil) {
[info release];
returnNO;
}
if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"07"]||[code isEqualToString:@"01"]) {
ret =YES;
}
[info release];
return ret;
}
网络在00---02---07三种情况时是移动网络。具体参考下面的数据
MCC | MNC | Brand | Operator | Status | Bands (MHz) | References and notes |
---|---|---|---|---|---|---|
460 | 00 | China Mobile | China Mobile | Operational | GSM 900 / GSM 1800 / TD-SCDMA 1880 / TD-SCDMA 2010 | |
460 | 01 | China Unicom | China Unicom | Operational | GSM 900 / GSM 1800 / UMTS 2100 | CDMA network sold to China Telecom, WCDMA commercial trial started in May 2009 and in full commercial operation as of October 2009. |
460 | 02 | China Mobile | China Mobile | Operational | GSM 900 / GSM 1800 / TD-SCDMA 1880 / TD-SCDMA 2010 | |
460 | 03 | China Telecom | China Telecom | Operational | CDMA2000 800 / CDMA2000 2100 | EV-DO |
460 | 05 | China Telecom | China Telecom | Operational | |
|
460 | 06 | China Unicom | China Unicom | Operational | GSM 900 / GSM 1800 / UMTS 2100 | |
460 | 07 | China Mobile | China Mobile | Operational | GSM 900 / GSM 1800 / TD-SCDMA 1880 / TD-SCDMA 010 | |
460 | 20 | China Tietong | China Tietong | Operational | GSM-R |
详细数据请参考:http://en.wikipedia.org/wiki/Mobile_Network_Code
iOS 4.0 的官方 API 裡頭,多了一個叫做 Core Telephony 的 framework;一直以來 Core Telephony 都是 private API,現在開放出來,但是從文件來看,裡頭根本沒有幾行,既沒有告訴你應該怎麼用,也沒有範例,你從 framework 裡頭寥寥四個 class 的 header 中,也搞不清楚,究竟可以把這個東西用在什麼用途上。
目前只知道可以拿來做兩件事情:1. 知道目前你這隻 iPhone 用的是哪個電信商的服務;2. 知道現在 iPhone 是不是在打電話。
用 CTTelephonyNetworkInfo 與 CTCarrier 這兩個 class,就可以取得電信商資訊,例如:
1 |
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init]; |
2 |
CTCarrier *carrier = info.subscriberCellularProvider; |
3 |
NSLog ( @"carrier:%@" , [carrier description]); |
倒出來的結果像是:
CTCarrier (0x140dc0) {
Carrier name: [中華電信]
Mobile Country Code: [466]
Mobile Network Code:[92]
ISO Country Code:[tw]
Allows VOIP? [YES]
}
然後,如果你對 CTTelephonyNetworkInfo 餵一個 block 進去,像是:
1 |
info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) { NSLog ( @"carrier:%@" , [carrier description]);}; |
如此一來,當你的 iPhone 漫遊到了其他網路的時候,就會執行你這段 block,但光是知道手機現在漫遊在哪個電信商的網路裡頭,大概能做的,就是一些跟電信商關係密切的服務之類,你或許可以決定軟體裡頭有哪些功能,一定要在某個電信商的網路才能用;電信商自己做 iPhone 軟體的時候大概會想做這種事情。
用 CTCallCenter 與 CTCall 這兩個 class,便可以知道目前 iPhone 是否在通話中。CTCallCenter 的用途是用來監控是不是有電話打進來、正在接聽、或是已經掛斷,而 CTCall 則是將每一則通話事件包裝成一個物件。我們先寫一小段程式-
1 |
CTCallCenter *center = [[CTCallCenter alloc] init]; |
2 |
center.callEventHandler = ^(CTCall *call) { |
3 |
NSLog ( @"call:%@" , [call description]); |
4 |
}; |
然後,在實機上執行,接著打通電話到這支 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。