2008-10-10 19 views
295

¿Hay alguna forma de obtener su propio número de teléfono mediante las API estándar del SDK de iPhone?Obtenga su propio número de teléfono mediante programación en iOS

+0

puede ser útil para otros que busquen una solución que no use aplicaciones privadas [cómo-hace-cuadrados-tarjeta-de-aplicación-hacer-esto - use el nombre del dispositivo para capturar el nombre de los usuarios] (http://stackoverflow.com/ questions/8000927/how-does-squares-cardcase-app-do-this/8058188 # 8058188) simplemente enmiende para capturar el número de teléfono u otros detalles según corresponda –

Respuesta

286

A riesgo de obtener marcas negativas, quiero sugerir que la solución de mayor rango (actualmente la primera respuesta) viola el último Acuerdo de SDK desde el 5 de noviembre de 2009. Nuestra aplicación fue rechazada por usarla. Aquí está la respuesta de Apple:

"Por razones de seguridad, iPhone OS restringe una aplicación (incluyendo sus preferencias y datos) a una ubicación única en el sistema de archivos. Esta restricción es parte de la característica de seguridad conocida como" sandbox "de la aplicación . "La zona de pruebas 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 la aplicación. Deberá revisar su aplicación para que se lea solo dentro de su contenedor de directorio y volver a enviar su archivo 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 tenga que ingresar su propio número de teléfono.

+67

¿Cómo lo hace Snapchat? – rgbrgb

+1

@Dylan: ¿Cuándo se rechazó su aplicación? ¿Se han revisado las pautas? Proporcione enlaces útiles a la documentación. Sin embargo, aprecio tu respuesta. –

+1

¿Puedo obtener el enlace de la documentación de apple.developer donde se menciona esto? –

126

No, no hay una forma legal y confiable de hacerlo.

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

+65

No estoy seguro de por qué esto recibe tantos votos atrasados ​​- es tan correcto como se pone. –

+2

Ver la respuesta de Nik Burn: http://stackoverflow.com/a/8415162/292166 - ¡existe (más o menos) una forma de hacer esto! – JosephH

+4

¿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á inmediatamente claro. Es desafortunado 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

81

Actualización: capacidad parece haber sido eliminado por Apple en o alrededor de iOS 4


Sólo se expanda en una respuesta anterior, algo como esto lo hace por mí:

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

Nota: Recupera el "Número de teléfono" que se ingresó durante la activación de iTunes del iPhone y puede ser nulo o un valor incorrecto. Es NO leer desde 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 es en mi aplicación que utiliza un UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically 
NSInterfaceStyle 
TVOutStatus 
WebKitDeveloperExtrasEnabledPreferenceKey 

y así sucesivamente.

No estoy seguro de qué hacen los demás, en todo caso.

+1

Ha habido algunas noticias recientes sobre las preocupaciones de seguridad detrás de esta habilidad: http://www.theregister.co.uk/2009/09/30/iphone_security/ – JeffH

+0

¿Alguna actualización de la prensa y la resolución de Apple? – Bryan

+92

Apple acaba de rechazar mi aplicación por usar esto. http://img.ly/dbZ – Mugunth

22

Como probablemente todo listo saber si se utiliza la siguiente línea de código, su aplicación será rechazada por Apple

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

aquí es una referencia

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

puede utilizar la la siguiente información en su lugar

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

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

y así sucesivamente

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

Hope this helps!

+9

uniqueIdentifier también está en desuso en iOS5. Use la dirección MAC en su lugar. – Raptor

+15

La dirección MAC está en desuso en iOS 7. En su lugar, use '[UIDevice identifierForVendor]'. – jab

+10

iOS 7 está en desuso. Use iOS 10 en su lugar (lo siento, no pude detenerme). – JustAMartin

23

Usando la API privada puede obtener el número de teléfono del usuario en la siguiente forma:

extern NSString* CTSettingCopyMyPhoneNumber(); 


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

return phone; 
} 

también incluyen CoreTelephony.framework a su proyecto.

+0

Después de leer otras respuestas en este foro, estaba pensando que no es posible pero que ha hecho un trabajo perfecto –

+0

esto no funciona en iOS7 – user501836

+1

En iOS 7 está protegido por el derecho http://stackoverflow.com/questions/19504478/ios -7-how-to-get-own-number-via-private-api/20830611 # 20830611 – creker

1

Para obtener su número de teléfono, puede leer un archivo plist. No va a trabajar en iDevices no 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 permite esto, pero funciona en iPhones.

+2

Esto no funciona en iOS 7. – respectTheCode

+0

Esto no funciona en iOS 10 y encima. –

1

No hay API oficial para hacerlo. El uso de la API privada puede utilizar el método siguiente:

-(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 se mencionó creker en iOS 7 con JB, necesita utilizar los derechos para que funcione.

Cómo lo hace con los derechos que puede encontrar aquí: iOS 7: How to get own number via private API?

0

Usted puede pedir al usuario y m.phone verficate que el uso de SMS. Legalmente, no hay método para saberlo.

0

No puede obtener su propio número de teléfono debido a algún motivo de seguridad, pero puede buscar su número. Guárdelo en su lista de contactos y luego puede buscar su número mediante programación.

Cuestiones relacionadas