Esiste un modo per ottenere il proprio numero di telefono tramite API standard da iPhone SDK?
Esiste un modo per ottenere il proprio numero di telefono tramite API standard da iPhone SDK?
Risposte:
A rischio di ottenere voti negativi, desidero suggerire che la soluzione di livello più elevato (attualmente la prima risposta) viola l'ultimo accordo SDK del 5 novembre 2009. La nostra applicazione è stata appena respinta per l'utilizzo. Ecco la risposta di Apple:
"Per motivi di sicurezza, il sistema operativo iPhone limita un'applicazione (incluse le sue preferenze e i suoi dati) a una posizione univoca nel file system. Questa limitazione fa parte della funzione di sicurezza nota come" sandbox "dell'applicazione. Il sandbox è un insieme di controlli dettagliati che limitano l'accesso di un'applicazione a file, preferenze, risorse di rete, hardware e così via. "
Il numero di telefono del dispositivo non è disponibile nel contenitore dell'applicazione. Dovrai rivedere la tua applicazione per leggerla solo nel tuo contenitore di directory e inviare nuovamente il tuo file binario a iTunes Connect per poter riconsiderare la tua applicazione sull'App Store.
Questa è stata una vera delusione poiché volevamo risparmiare all'utente che doveva inserire il proprio numero di telefono.
No, non esiste un modo legale e affidabile per farlo.
Se trovi un modo, sarà disabilitato in futuro, come è successo con ogni metodo prima.
Aggiornamento: la funzionalità sembra essere stata rimossa da Apple su iOS 4 o nelle vicinanze
Solo per espandere una risposta precedente, qualcosa del genere fa per me:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
Nota : questo recupera il "Numero di telefono" che è stato inserito durante l'attivazione di iTunes di iPhone e può essere nullo o un valore errato. E ' NON letti dalla scheda SIM.
Almeno questo succede in 2.1. Ci sono un paio di altre chiavi interessanti in NSUserDefaults che potrebbero anche non durare. (Questo è nella mia app che utilizza un UIWebView)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
e così via.
Non sono sicuro di cosa facciano gli altri.
Utilizzando l'API privata puoi ottenere il numero di telefono dell'utente nel modo seguente:
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
Includi anche CoreTelephony.framework nel tuo progetto.
Come probabilmente tutti saprai se usi la seguente riga di codice, la tua app verrà rifiutata da Apple
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
ecco un riferimento
http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html
puoi invece utilizzare le seguenti informazioni
NSString *phoneName = [[UIDevice currentDevice] name];
NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];
e così via
@property(nonatomic,readonly,retain) NSString *name; // e.g. "My iPhone"
@property(nonatomic,readonly,retain) NSString *model; // e.g. @"iPhone", @"iPod Touch"
@property(nonatomic,readonly,retain) NSString *localizedModel; // localized version of model
@property(nonatomic,readonly,retain) NSString *systemName; // e.g. @"iPhone OS"
@property(nonatomic,readonly,retain) NSString *systemVersion; // e.g. @"2.0"
@property(nonatomic,readonly) UIDeviceOrientation orientation; // return current device orientation
@property(nonatomic,readonly,retain) NSString *uniqueIdentifier; // a string unique to each device based on various hardware info.
Spero che questo ti aiuti!
[UIDevice identifierForVendor]
invece.
Non puoi utilizzare le API iOS da solo per acquisire il numero di telefono (anche in un'app privata con API private), poiché tutti i metodi noti per farlo sono stati modificati e bloccati a partire da iOS 11. Anche se viene trovato un nuovo exploit, Apple ha realizzato chiarire che rifiuteranno qualsiasi app dall'App Store per l'utilizzo di API private per fare ciò. Vedi la risposta di @ Dylan per i dettagli.
Tuttavia, esiste un modo legale per acquisire il numero di telefono senza alcuna immissione dei dati dell'utente . Questo è simile a quello di Snapchat, ma più semplice, in quanto non richiede all'utente di digitare il proprio numero di telefono.
L'idea è di fare in modo che l'app invii a livello di codice un messaggio SMS a un server con il codice di installazione univoco dell'app. L'app può quindi interrogare lo stesso server per vedere se ha recentemente ricevuto un messaggio SMS da un dispositivo con questo codice di installazione dell'app unico. In tal caso, può leggere il numero di telefono che lo ha inviato. Ecco un video dimostrativo che mostra il processo. Come puoi vedere, funziona come un fascino!
Non è facile da configurare, ma può essere configurato in poche ore gratuitamente su un livello AWS gratuito con il codice di esempio fornito nel tutorial qui .
Per ottenere il tuo numero di telefono puoi leggere un file plist. Non funzionerà su iDevices senza jailbreak:
NSString *commcenter = @"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist";
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:commcenter];
NSString *PhoneNumber = [dict valueForKey:@"PhoneNumber"];
NSLog([NSString stringWithFormat:@"Phone number: %@",PhoneNumber]);
Non so se Apple lo consenta, ma funziona su iPhone.
Nessuna API ufficiale per farlo. Utilizzando l'API privata è possibile utilizzare il seguente metodo:
-(NSString*) getMyNumber {
NSLog(@"Open CoreTelephony");
void *lib = dlopen("/Symbols/System/Library/Framework/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);
NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");
NSString* (*pCTSettingCopyMyPhoneNumber)() = dlsym(lib, "CTSettingCopyMyPhoneNumber");
NSLog(@"Get CTSettingCopyMyPhoneNumber from CoreTelephony");
if (pCTSettingCopyMyPhoneNumber == nil) {
NSLog(@"pCTSettingCopyMyPhoneNumber is nil");
return nil;
}
NSString* ownPhoneNumber = pCTSettingCopyMyPhoneNumber();
dlclose(lib);
return ownPhoneNumber;
}
Funziona su iOS 6 senza JB e firma speciale.
Come menzionato Creker su iOS 7 con JB, devi usare i diritti per farlo funzionare.
Come farlo con i diritti che puoi trovare qui: iOS 7: Come ottenere il proprio numero tramite API privata?
AppStore lo rifiuterà, poiché si estende all'esterno del contenitore dell'applicazione.
Le app devono essere autosufficienti nei loro bundle e non possono leggere o scrivere dati al di fuori dell'area del contenitore designata
Sezione 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements