Obtenga programáticamente su propio número de teléfono en iOS

330

¿Hay alguna forma de obtener un número de teléfono propio mediante API estándar del iPhone SDK?

Vadim
fuente
puede ser útil para otras personas que buscan una solución que no use la aplicación privada how-does-squares-cardcase-app-do-this: use el nombre del dispositivo para capturar el nombre de los usuarios, solo modifíquelo para capturar el número de teléfono u otros detalles según corresponda
Nik Burns
davidgyoung ha proporcionado una solución de trabajo. Está enterrado (necesita algunos votos positivos).
P i
Ahora es posible en Xcode como este stackoverflow.com/a/54004224/536214
aqavi_paracha

Respuestas:

318

A riesgo de obtener calificaciones negativas, quiero sugerir que la solución de más alto rango (actualmente la primera respuesta) viola el último Acuerdo SDK a partir del 5 de noviembre de 2009. Nuestra solicitud fue rechazada por usarla. Aquí está la respuesta de Apple:

"Por razones de seguridad, iPhone OS restringe una aplicación (incluidas sus preferencias y datos) a una ubicación única en el sistema de archivos. Esta restricción es parte de la función de seguridad conocida como" sandbox "de la aplicación. El sandbox es un conjunto de controles detallados que limitan el acceso de una aplicación a archivos, preferencias, recursos de red, hardware, etc. "

El número de teléfono del dispositivo no está disponible en el contenedor de su aplicación. Deberá revisar su aplicación para leer solo dentro de su contenedor de directorio y volver a enviar su binario a iTunes Connect para que su aplicación sea reconsiderada para la App Store.

Esto fue una verdadera decepción ya que queríamos evitar que el usuario tuviera que ingresar su propio número de teléfono.

Dylan
fuente
83
¿Cómo lo hace Snapchat?
rgbrgb
1
@Dylan: ¿Cuándo se rechazó su aplicación? ¿Quizás se revisen las pautas? Proporcione enlaces útiles a la documentación. Sin embargo, agradezco su respuesta.
Abhishek Bedi
1
¿Puedo obtener el enlace de documentación de apple.developer donde se menciona esto?
Ganesh AB - Android
3
Nunca he encontrado ninguna documentación sobre esto, pero me encantaría verla. Es una de esas áreas donde Apple se ha mantenido opaca para mí. No he intentado enviar una solicitud desde esto.
Dylan
1
@rgbrgb No uso Snapchat, ¿puedes explicar su experiencia que es tan desconcertante?
William Entriken
138

No, no hay una forma legal y confiable de hacer esto.

Si encuentra una manera, se desactivará en el futuro, como ha sucedido con todos los métodos anteriores.

Andrew Grant
fuente
2
Vea la respuesta de Nik Burn: stackoverflow.com/a/8415162/292166 - ¡hay (una especie de) forma de hacerlo!
JosephH
44
¿Cuál es la mejor razón que ha visto para que Apple no permita el acceso basado en permisos al número de teléfono del usuario? Apple ya permite el acceso basado en permisos a contactos, fotos, ubicación y la cámara y el micrófono del usuario. ¿Por qué no el número de teléfono? Debe haber una buena razón, pero no está claro de inmediato. Es lamentable porque prohibir el acceso hace que los desarrolladores gasten mucho tiempo y dinero en otras formas de verificar el número de teléfono de un usuario.
Crashalot
86

Actualización: la capacidad parece haber sido eliminada por Apple en iOS 4 o alrededor


Solo para ampliar una respuesta anterior, algo como esto lo hace por mí:

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

Nota : Esto recupera el "Número de teléfono" que se ingresó durante la activación de iTunes del iPhone y puede ser un valor nulo o incorrecto. Es NO leen en la tarjeta SIM.

Al menos eso hace en 2.1. Hay un par de otras claves interesantes en NSUserDefaults que también pueden no durar. (Esto está en mi aplicación que usa un UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

y así.

No estoy seguro de qué, si acaso, hacen los demás.

Robert Sanders
fuente
1
Ha habido alguna prensa reciente sobre las preocupaciones de seguridad detrás de esta capacidad: theregister.co.uk/2009/09/30/iphone_security
JeffH
10
No lo hagas Solicite al usuario el número mediante el teclado o el selector de contactos. Debe hacer que la recopilación de información sea lo más explícita posible para el usuario. Puede que no sea el más conveniente, pero es muy fácil guardar el número, por lo que solo tiene que pedirlo una vez.
David Kanarek
3
Una solución que rechaza las aplicaciones no es una solución.
averydev
27

Con Private API puede obtener el número de teléfono del usuario de la siguiente manera:

extern NSString* CTSettingCopyMyPhoneNumber();


+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();

return phone;
}

También incluya CoreTelephony.framework a su proyecto.

Igor
fuente
Después de leer otras respuestas en este foro, estaba pensando que no es posible, pero has hecho un trabajo perfecto
Mehul Thakkar
1
En iOS 7 está protegido por el derecho stackoverflow.com/questions/19504478/…
creker
el teléfono es nulo cuando intento esto
C0D3
22

Como probablemente ya sepa, si usa la siguiente línea de código, Apple rechazará su aplicación

NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];

aquí hay una referencia

http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

puedes usar la siguiente información en su lugar

NSString *phoneName = [[UIDevice currentDevice] name];

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

y así

@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.

¡Espero que esto ayude!

Andres Garcia
fuente
99
uniqueIdentifier también está en desuso en iOS5. Utilice la dirección MAC en su lugar.
Raptor
15
La dirección MAC está en desuso en iOS 7. Use en su [UIDevice identifierForVendor]lugar.
jab
17

No puede usar las API de iOS solo para capturar el número de teléfono (incluso en una aplicación privada con API privadas), ya que todos los métodos conocidos para hacerlo se han parcheado y bloqueado a partir de iOS 11. Incluso si se encuentra un nuevo exploit, Apple ha hecho claro que rechazarán cualquier aplicación de la tienda de aplicaciones por usar API privadas para hacer esto. Ver la respuesta de @ Dylan para más detalles.

Sin embargo, hay una forma legal de capturar el número de teléfono sin ninguna entrada de datos del usuario . Esto es similar a lo que hace Snapchat, pero más fácil, ya que no requiere que el usuario escriba su propio número de teléfono.

La idea es que la aplicación envíe un mensaje SMS mediante programación a un servidor con el código de instalación único de la aplicación. Luego, la aplicación puede consultar el mismo servidor para ver si ha recibido recientemente un mensaje SMS de un dispositivo con este código único de instalación de la aplicación. Si es así, puede leer el número de teléfono que lo envió. Aquí hay un video de demostración que muestra el proceso. Como puede ver, ¡funciona de maravilla!

Esto no es muy fácil de configurar, pero se configurará en unas pocas horas sin cargo en un nivel de AWS gratuito con el código de muestra proporcionado en el tutorial aquí .

davidgyoung
fuente
Lo siento. El video fue accidentalmente privado. Es público ahora.
davidgyoung
Esta es una excelente manera, pero ¿podría enriquecer su respuesta al menos para cubrir los detalles básicos de implementación? ¿Cómo se envía un SMS desde un dispositivo iOS sin conocer su número de teléfono? ¿Cómo se configura un servidor de recepción de SMS que tiene acceso al número de teléfono del remitente? ¿Qué herramientas están involucradas? ¿compatibilidad?
Motti Shneor
@MottiShneor, ¿viste el enlace del tutorial en la respuesta? Esto tiene un tutorial completo sobre cómo configurar esta solución, así como un código de aplicación de muestra en funcionamiento en un repositorio de Github.
davidgyoung
2

Para obtener su número de teléfono, puede leer un archivo plist. No funcionará en iDevices sin 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]);

No sé si Apple lo permite, pero funciona en iPhones.

David Gölzhäuser
fuente
Apple anula la garantía en teléfonos con jailbreak y una aplicación debería tener una capacidad ubicua para todos los usuarios.
Cosmtar
2

No hay API oficial para hacerlo. Usando API privada puedes usar el siguiente método:

-(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;
}

Funciona en iOS 6 sin JB y firma especial.

Como mencionó creker en iOS 7 con JB , debe usar los derechos para que funcione.

Cómo hacerlo con los derechos que puede encontrar aquí: iOS 7: ¿Cómo obtener un número propio a través de una API privada?

0x8BADF00D
fuente