12

我们有一个产品,用户通过提供他们的电话号码进行注册。

但是,在他们注册后,他们可能会更改他们的 SIM 卡。

是否可以以编程方式确定 SIM 卡是否已被移除或插入?

(谢谢你提供它,但是任何关于首先使用电话号码的题外话评论都与这个讨论无关,我不想讨论这方面的事情,只讨论 sim 方面)。

4

1 回答 1

23

是的,当然有可能。链接 CoreTelephony.framework 以编译以下代码:

CTTelephonyNetworkInfo* info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = info.subscriberCellularProvider;
NSString *mobileCountryCode = carrier.mobileCountryCode;
NSString *carrierName = carrier.carrierName;
NSString *isoCountryCode = carrier.isoCountryCode;
NSString *mobileNetworkCode = carrier.mobileNetworkCode;

// Try this to track CTCarrier changes 
info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier* inCTCarrier) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"User did change SIM");
        });
};

通过 mobileCountryCode、mobileNetworkCode、carrierName、isoCountryCode 的值可以判断 SIM 卡的存在。(没有 SIM,它们会变得不正确)。

CoreTelephony 中还有一些未记录的功能/通知,但如果您使用它们,您的应用程序可能会被 Apple 禁止。反正:

// Evaluates to @"kCTSIMSupportSIMStatusReady" when SIM is present amd ready; 
// there are some other values like @"kCTSIMSupportSIMStatusNotInserted"
NSString* CTSIMSupportGetSIMStatus(); 

// Use @"kCTSIMSupportSIMStatusChangeNotification" to track changes of SIM status:
[[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(SIMNotification:)
    name:@"kCTSIMSupportSIMStatusChangeNotification"
    object:nil
];

// 这个复制当前电话号码
NSString* CTSettingCopyMyPhoneNumber()

附录另一种可能(且合法)的解决方案:如果您的公司有电话号码数据库,您可以发送短信或呼叫(并切断)任何特定号码,以验证用户是否仍然使用相同的电话号码。

UPDATE函数NSString* CTSettingCopyMyPhoneNumber()不再起作用(返回空字符串)。

于 2012-06-05T20:33:55.283 回答