2012-06-03 14 views
12

Abbiamo un prodotto in cui l'utente si registra fornendo il proprio numero di telefono.È possibile determinare se il numero di SIM/telefono è cambiato?

Tuttavia dopo la registrazione potrebbero potenzialmente cambiare la loro simulazione.

È possibile determinare in modo programmatico se la simulazione è stata rimossa o inserita?

(Grazie se lo fornite, ma qualsiasi commento di digressione sull'uso dell'utilizzo del numero di telefono in primo luogo sarebbe irrilevante per questa discussione, non voglio discutere questo aspetto delle cose, solo l'aspetto della simulazione).

risposta

23

Sì, certo che è possibile. Collegamento CoreTelephony.framework per rendere il codice seguente compilazione:

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"); 
     }); 
}; 

da valori di mobileCountryCode, mobileNetworkCode, CARRIERNAME, isoCountryCode si può giudicare sulla presenza della SIM. (Senza SIM diventano errati).

Ci sono anche alcune funzioni/notifiche non documentate in CoreTelephony, ma la tua app potrebbe essere bandita da Apple se le userai. In ogni caso:

// 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 
]; 

// Questo telefono corrente una copia numero
NSString * CTSettingCopyMyPhoneNumber()

Addendum Un'altra possibile (e legale) Soluzione: se la vostra azienda ha un database di numeri di telefono, è possibile inviare un sms o chiamare (e tagliare) qualsiasi numero specifico per verificare che l'utente usi ancora lo stesso numero di telefono.

UPDATE La funzione NSString* CTSettingCopyMyPhoneNumber() non funziona più (restituisce una stringa vuota).

+0

Ciò non aiuta molto quando vuole scoprire se l'utente ha cambiato la carta SIM. Questa classe restituisce solo informazioni che non possono in alcun modo separare due schede SIM. Cosa succede se l'utente ha cambiato la carta SIM e il numero di telefono, ma utilizza ancora la stessa compagnia aerea? – Andreas

+1

Come dice Andreas, di per sé questa API [documentata] non è molto utile, tuttavia se fosse possibile registrarsi per una notifica di modifica di uno di questi valori sarebbe utile. Anche se l'utente estrae la sim e poi inserisce di nuovo la stessa, se sapessi che è successo non è poi così male, anche se non so che i sim erano diversi o meno. Almeno vorrei sapere che i sim * potrebbero * potenzialmente essere diversi. Grazie per le informazioni sull'API non documentata, forse è possibile scoprire se va bene con Apple per usarlo. – Gruntcakes

+0

Andreas, Chris, dovrei dichiararlo chiaramente: non è in grado di ottenere informazioni SIM valutabili con qualsiasi mezzo documentato. Possiamo solo indovinare da iterpreting di informazioni sull'operatore e sulla disponibilità della rete cellulare. Se questo non è abbastanza per te, quindi utilizza funzionalità non documentate e hack. Ce ne sono molti in iOS. Ma potresti essere bandito da Appstore, e c'è una ragione per questo. Se qualcuno otterrà tali informazioni dalla SIM come il numero di telefono o IMSI, ci sono una miriade di possibilità di fare un sacco di cose cattive come lo spam del cellulare, intercettazioni ecc. –