Ответ 1
Да, конечно, это возможно. Ссылка 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-карты. (Без сим они становятся некорректными).
В 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()
Приложение Еще одно возможное (и юридическое) решение: если у вашей компании есть база телефонных номеров, вы можете отправить смс или позвонить (и сократить) любой конкретный номер, чтобы убедиться, что пользователь все еще использует тот же номер телефона.
ОБНОВЛЕНИЕ Функция NSString* CTSettingCopyMyPhoneNumber()
больше не работает (возвращает пустую строку).