iOS获取手机卡IMSI信息

在日常开发中,我们都需要对用户登录做一些限制,对用户做一些唯一标识,或者免密码登录的操作。

一般都是获取UUID、UDID、IDFA....等方法,但都是不能保证是唯一的,比较靠谱的方法是利用钥匙串(keyChain)保存UUID,每次都从keyChain里面取。

但是公司有的项目,想利用手机卡的信息,来免密登录,保证用户的唯一性,安卓直接可以读取IMSI信息,只要把卡换到新手机也一样可以登录,就不受设备的限制了。

1.什么是IMSI信息

名词解释 
IMSI:International Mobile Subscriber Identification Number 国际移动用户识别码。

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 来确定运营商了。当然知道编码规则同时还是需要知道对应编码的的国家和网络了。

注意:其实苹果是非常注重隐私保护的,所以提供的api并不能把15位都获取到,只能获取到部分信息,如下

 

2.具体代码方法

1.导入头文件

#import <CoreTelephony/CTCarrier.h>

#import <CoreTelephony/CTTelephonyNetworkInfo.h>

2.获取方法

- (NSDictionary *)getIMSIInfo{
    CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
    CTCarrier *carrier = nil;
    NSString *radioType = nil;
    if (@available(iOS 12.1, *)) {
 
        if (info && [info respondsToSelector:@selector(serviceSubscriberCellularProviders)]) {
 
            NSDictionary *dic = [info serviceSubscriberCellularProviders];
            if (dic.allKeys.count) {
                carrier = [dic objectForKey:dic.allKeys[0]];
            }
        }
 
        if (info && [info respondsToSelector:@selector(serviceCurrentRadioAccessTechnology)]) {
 
            NSDictionary *radioDic = [info serviceCurrentRadioAccessTechnology];
            if (radioDic.allKeys.count) {
                radioType = [radioDic objectForKey:radioDic.allKeys[0]];
            }
        }
 
    }
 
    //运营商可用
    BOOL use = carrier.allowsVOIP;
    //运营商名字
    NSString *name = carrier.carrierName;
    //ISO国家代码
    NSString *code = carrier.isoCountryCode;
    //移动国家代码
    NSString *mcc = [carrier mobileCountryCode];
    //移动网络代码
    NSString *mnc = [carrier mobileNetworkCode];
     NSDictionary *dict =@{
        @"name":name,@"code":code,@"mcc":mcc,@"mnc":mnc
    };
    NSLog(@"运营商名字:%@,ISO国家代码:%@,移动国家代码:%@,移动网络代码:%@",name,code,mcc,mnc);
    return dict;
}
我们进入系统CTCarrier里面也就只有这几个属性,如下图

 

3.总结:

iOS获取手机卡IMSI信息是不全的,只能获取部分的信息,所以想利用IMSI作为绑定用户,作为唯一标识,做免密登录是行不通的,只能另想他法。

希望苹果以后能更新这方面的api吧!
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值