2012-06-03 2 views
12

У нас есть продукт, в котором пользователь регистрируется, указав свой номер телефона.Можно ли определить, изменился ли номер SIM/Телефон?

Однако после регистрации они могут сменить свой сим.

Можно ли программно определить, был ли удален или вставлен симулятор?

(Спасибо, если вы предоставите его, но любые замечания по отклонению от использования номера телефона в первую очередь были бы неактуальны для этого обсуждения, я не хочу обсуждать этот аспект вещей, только аспект sim).

ответ

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()

Добавление Другой возможный (и юридическое) решение: если ваша компания имеет базу данных телефонные номера, вы можете отправить sms или позвонить (и вырезать) любой конкретный номер, чтобы убедиться, что пользователь по-прежнему использует тот же номер телефона.

UPDATE Функция NSString* CTSettingCopyMyPhoneNumber() больше не работает (возвращает пустую строку).

+0

Это мало помогает, когда он хочет узнать, изменил ли пользователь SIM-карту. Этот класс возвращает только информацию, которая никоим образом не может отделить две SIM-карты. Что делать, если пользователь изменил SIM-карту и номер телефона, но все-таки пользуется одним и тем же носителем? – Andreas

+1

Как говорит Андреас, сам этот [документированный] API не очень полезен, однако, если бы можно было зарегистрироваться для уведомления об изменении одного из этих значений, которое было бы полезно. Даже если пользователь вынимает сим, а затем снова помещает туда же, если бы я знал, что это произошло, тогда это не так уж плохо, даже если я не знаю, что симы были разными или нет. По крайней мере, я бы знал, что симы * могут быть потенциально разными. Благодарим за информацию о недокументированном API, возможно, ее можно узнать, нормально ли это использовать apple. – Gruntcakes

+0

Андреас, Крис, я должен четко заявить: он не может наверняка получить какую-либо полезную информацию о SIM-карте. Мы можем только догадываться, выполнив эту информацию и информацию о сотовой сети. Если этого недостаточно для вас, используйте недокументированные функции и хаки. Их много в iOS. Но вы можете быть заблокированы из Appstore, и для этого есть причина. Если кто-то получит такую ​​информацию с SIM-карты, как номер телефона или IMSI, есть возможность сделать много плохих вещей, таких как спам сотового телефона, подслушивание и т. Д. –