iphone 通过获取IMSI判断运营商

无庸置疑,以下的所有操作必须建立在已越狱的iPhone手机上。

首先,在建立工程之后我们要引入一个名为CoreTelephony.framework的框架,他是一个是一个有关电话、短信和邮件通讯的框架。

需引入框架CoreTelephony.framework (私有API)


导入头文件
#import<CoreTelephony/CTTelephonyNetworkInfo.h>
#import<CoreTelephony/CTCarrier.h>




先定义以下方法:
//用来辨别设备所使用网络的运营商
- (NSString*)checkCarrier


{


NSString *ret = [[NSString alloc]init];


CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];


CTCarrier *carrier = [info subscriberCellularProvider];


if (carrier == nil) {


[info release];


return @"0";


}


NSString *code = [carrier mobileNetworkCode];


if (code == @"") {


[info release];


return @"0";


}


if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"07"]) {


ret = @"移动";
}


if ([code isEqualToString:@"01"]|| [code isEqualToString:@"06"] ) {
ret = @"联通";
}


if ([code isEqualToString:@"03"]|| [code isEqualToString:@"05"] ) {
ret = @"电信";;
}


[info release];
return ret;


}


 

实现的代码如下:

/* China - CN
 * MCC    MNC    Brand    Operator                Status        Bands (MHz)                                    References and notes
 * 460    00            China Mobile            Operational    GSM 900/GSM 1800 UMTS (TD-SCDMA) 1880/2010
 * 460    01            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            Operational    GSM 900/GSM 1800/ UMTS (TD-SCDMA) 1880/2010    
 * 460    03            China Telecom            Operational    CDMA 800/cdma evdo 2100    
 * 460    05            China Telecom            Operational        
 * 460    06            China Unicom            Operational    GSM 900/GSM 1800/UMTS 2100    
 * 460    07            China Mobile            Operational    GSM 900/GSM 1800/UMTS (TD-SCDMA) 1880/2010    
 * 460    20            China Tietong            Operational    GSM-R    
 * NA    NA            China Telecom&China Unicom    Operational        
 */
+ (NSString*)getCarrier:(NSString*)imsi
{
    if (imsi == nil || [imsi isEqualToString:@"SIM Not Inserted"] ) {
        return @"Unknown";
    }
    else {
        if ([[imsi substringWithRange:NSMakeRange(0, 3)] isEqualToString:@"460"]) {
            NSInteger MNC = [[imsi substringWithRange:NSMakeRange(3, 2)] intValue];
            switch (MNC) {
                case 00:
                case 02:
                case 07:
                    return @"China Mobile";
                    break;
                case 01:
                case 06:    
                    return @"China Unicom";
                    break;
                case 03:
                case 05:    
                    return @"China Telecom";
                    break;
                case 20:
                    return @"China Tietong";
                    break;
                default:
                    break;
            }
        }
    }
    return @"Unknown";
}


以下转自 http://zonble.net/archives/2010_06/1330.php,注意要加头文件目录 /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 是不是在打电话。

※ 电信商资讯

用 CTTelephonyNetworkInfo 与 CTCarrier 这两个 class,就可以取得电信商资讯,例如:

CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = info.subscriberCellularProvider;
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 进去,像是:

info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) {NSLog(@"carrier:%@", [carrier description]);};

如 此一来,当你的 iPhone 漫游到了其他网路的时候,就会执行你这段 block,但光是知道手机现在漫游在哪个电信商的网路里头,大概能做的,就是一些跟电信商关系密切的服务之类,你或许可以决定软体里头有哪些功能,一定 要在某个电信商的网路才能用;电信商自己做 iPhone 软体的时候大概会想做这种事情。
※ 通话资料

用 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。





ios如何判断当前网络的运营商

内容转至:http://www.iloss.me/2012/07/21/ios如何判断当前网络的运营商/#more-1091

在IOS上存在retain屏,经常需要在一些时刻用到高清图,有些时候也要到普通图。
在网络条件很爽的情况下,这当然不在话下。如果咱是iphone用户,又正好用的是移动卡。
如果还用的高清图的话是不是灰常的杯具,显然是一定的。
从目前的情况来看,只有移动的gprs的卡速度慢的像牛一样,这样我们就需要权衡在一些场合牺牲点质量
换取速度。
那么我们就得必须知道当前网络是神马运营商。给个变通的解决方案。

- (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];
        return NO;
    }
 
    if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"07"]) {
        ret = YES;
    }
    [info release];
 
    return ret;
}


网络在00—02—07三种情况时是移动网络。具体参考下面的数据
China – CN

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

你可能感兴趣的:(iphone 通过获取IMSI判断运营商)