A livello di codice ottenere il proprio numero di telefono in iOS


330

Esiste un modo per ottenere il proprio numero di telefono tramite API standard da iPhone SDK?


può essere utile per gli altri alla ricerca di una soluzione che non usi il metodo how-do-squares-cardcase-app-do-this di api privato - usa il nome del dispositivo per catturare il nome degli utenti basta modificare per catturare il numero di telefono o altri dettagli a seconda dei casi
Nik Burns

davidgyoung ha fornito una soluzione funzionante. È sepolto (necessita di alcuni voti).
P

E 'ora possibile in Xcode come questo stackoverflow.com/a/54004224/536214
aqavi_paracha

Risposte:


318

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.


83
Come lo fa Snapchat?
rgbrgb,

1
@Dylan: quando l'app è stata rifiutata. Forse le linee guida sono state riviste? Fornire link utili alla documentazione. Tuttavia, apprezzo la tua risposta.
Abhishek Bedi,

1
Posso ottenere il link alla documentazione di apple.developer dove indicato?
Ganesh AB - Android

3
Non ho mai trovato alcuna documentazione su questo, ma mi piacerebbe vederlo. È una di quelle aree in cui Apple è rimasta opaca per me. Da allora non ho provato a presentare una domanda.
Dylan,

1
@rgbrgb Non uso Snapchat, puoi per favore spiegare la loro esperienza così misteriosa?
William Entriken,

138

No, non esiste un modo legale e affidabile per farlo.

Se trovi un modo, sarà disabilitato in futuro, come è successo con ogni metodo prima.


2
Vedi la risposta di Nik Burn: stackoverflow.com/a/8415162/292166 - esiste (in un certo senso) un modo per farlo!
JosephH,

4
Qual è la migliore ragione che hai visto per Apple che non consente l'accesso basato sul permesso al numero di telefono dell'utente? Apple consente già l'accesso basato su autorizzazioni a contatti, foto, posizione, nonché alla videocamera e al microfono dell'utente. Perché non il numero di telefono? Ci deve essere una buona ragione, ma non è immediatamente chiaro. È un peccato perché proibire l'accesso fa sì che gli sviluppatori spendano molto tempo e denaro in altri modi per verificare il numero di telefono di un utente.
Crashalot,

86

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.


1
C'è stata una stampa recente sulle preoccupazioni di sicurezza alla base di questa capacità: theregister.co.uk/2009/09/30/iphone_security
JeffH

10
Non farlo Chiedere all'utente il numero tramite tastiera o selettore di contatti. Dovresti rendere qualsiasi raccolta di informazioni il più esplicita possibile per l'utente. Potrebbe non essere il più conveniente, ma è molto facile salvare il numero, quindi devi solo richiederlo una volta.
David Kanarek, il

3
Una soluzione che rifiuta le app non è una soluzione.
averydev,

27

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.


Dopo aver letto le altre risposte in questo forum, stavo pensando che non è possibile, ma hai fatto un lavoro perfetto
Mehul Thakkar,

1
Su iOS 7 è protetta dal diritto stackoverflow.com/questions/19504478/...
creker

il telefono è zero quando provo questo
C0D3,

22

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!


9
uniqueIdentifier è anche deprecato in iOS5. Utilizzare invece l'indirizzo MAC.
Raptor

15
L'indirizzo MAC è obsoleto in iOS 7. Utilizzare [UIDevice identifierForVendor]invece.
jab

17

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 .


Scusate. Il video è stato accidentalmente privato. È pubblico ora.
davidgyoung,

Questo è un ottimo modo, ma potresti per favore arricchire la tua risposta per coprire almeno i dettagli di base dell'implementazione? Come si invia un SMS da un dispositivo iOS senza conoscere il proprio numero di telefono? come si configura un server di ricezione SMS che ha accesso al numero di telefono del mittente? Quali strumenti sono coinvolti? Compatibilità?
Motti Shneor,

@MottiShneor, hai visto il link tutorial nella risposta? Questo ha un tutorial completo sull'impostazione di questa soluzione e un codice app di esempio funzionante in un repository Github.
davidgyoung,

2

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.


Apple annulla la garanzia sui telefoni jailbreak e un'app dovrebbe avere capacità onnipresenti per tutti gli utenti.
Cosmtar,

2

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?


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.