日々の開発では、ユーザーのログインを制限したり、ユーザーを一意に識別したり、パスワードなしでログインしたりする必要があります。
一般に、UUID、UDID、IDFA ...などの取得などの方法は、一意であるとは限りません。より信頼性の高い方法は、キーチェーン(keyChain)を使用してUUIDを保存し、毎回keyChainから取得することです。
ただし、同社のプロジェクトによっては、携帯電話カードの情報を利用して、ユーザーの一意性を確保するために秘密裏にログインしたい場合があります。AndroidはIMSI情報を直接読み取ることができます。カードを新しい携帯電話に変更する限り、デバイスに制限されることなく、同じものを使用してログインできます。アップ。
1.IMSI情報とは
用語集
IMSI:国際モバイル加入者識別番号国際モバイル加入者識別番号。
IMSIは15桁で、その構造は次のとおりです。
MCC + MNC + MSIN、(MNC + MSIN = NMSI)
MCC:モバイルカントリーコード、モバイルカントリーコード、MCCリソースは、モバイルユーザーが属する国を一意に識別するInternational Telecommunications Union(ITU)によって一律に割り当てられ、管理されます。合計3桁で、中国は460です。
MNC:モバイルネットワークコード、モバイルネットワークコード、合計2桁、中国モバイルTDシステムは00を使用、中国ユニコムGSMシステムは01を使用、中国モバイルGSMシステムは02を使用、中国テレコムCDMAシステムは03を使用、一般的なIMSI番号は46030912121001です。
MSIN:モバイル加入者識別番号は10桁で、その構造は次のとおりです。
09 + M0M1M2M3 + ABCD
MDN番号のM0M1M2M3とH0H1H2H3は対応する関係を持つことができ、4つのABCDビットが自由に割り当てられます。
このようにして、IMSIのMCCおよびMNCに基づいて演算子を決定できます。もちろん、コーディングルールを知るには、コーディングに対応する国とネットワークも知る必要があります。
注:実際、Appleはプライバシー保護に細心の注意を払っているため、提供された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をバインディングユーザーとして唯一のサインとして使用する場合、パスワードなしのログインは実行できず、他の方法しか考えられません。
将来、Appleがこの点でapiを更新できることを願っています。