¿Hay alguna forma de obtener un número de teléfono propio mediante API estándar del iPhone SDK?
¿Hay alguna forma de obtener un número de teléfono propio mediante API estándar del iPhone SDK?
Respuestas:
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.
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.
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.
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.
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!
[UIDevice identifierForVendor]
lugar.
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í .
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.
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?
AppStore lo rechazará, ya que está llegando fuera del contenedor de la aplicación.
Las aplicaciones deben ser independientes en sus paquetes y no pueden leer ni escribir datos fuera del área designada del contenedor
Sección 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements