web-dev-qa-db-fra.com

Obtenir par programme son propre numéro de téléphone sous iOS

Existe-t-il un moyen d'obtenir son propre numéro de téléphone à l'aide des API standard du SDK iPhone?

311
Vadim

Au risque d’obtenir des notes négatives, je tiens à suggérer que la solution la mieux classée (actuellement la première réponse) enfreint le dernier Accord sur le SDK en date du 5 novembre 2009. Notre application vient d’être rejetée. Voici la réponse d'Apple:

"Pour des raisons de sécurité, iPhone OS limite une application (y compris ses préférences et ses données) à un emplacement unique dans le système de fichiers. Cette restriction fait partie de la fonction de sécurité appelée" bac à sable "de l'application. contrôles granuleux limitant l'accès d'une application aux fichiers, préférences, ressources réseau, matériel, etc. "

Le numéro de téléphone de l'appareil n'est pas disponible dans le conteneur de votre application. Vous devrez réviser votre application pour la lire uniquement dans votre conteneur de répertoires et soumettre à nouveau votre fichier binaire à iTunes Connect pour que votre application soit réexaminée pour l'App Store.

Ce fut une véritable déception, car nous voulions éviter à l'utilisateur de saisir son propre numéro de téléphone.

299
Dylan

Non, il n'y a pas de moyen légal et fiable de le faire.

Si vous trouvez un moyen, il sera désactivé dans le futur, comme cela s'est déjà produit avec chaque méthode auparavant.

135
Andrew Grant

Mise à jour: La fonctionnalité semble avoir été supprimée par Apple sur iOS 4 ou à proximité.


Juste pour développer une réponse précédente, quelque chose comme ça le fait pour moi:

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

Remarque : Ceci récupère le "numéro de téléphone" saisi lors de l'activation iTunes de l'iPhone et peut être nul ou incorrect. C'estPASlu sur la carte SIM.

Au moins cela fait en 2.1. Il existe quelques autres clés intéressantes dans NSUserDefaults qui peuvent également ne pas durer. (Ceci est dans mon application qui utilise un UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

etc.

Je ne sais pas ce que font les autres, le cas échéant.

83
Robert Sanders

En utilisant l'API privée, vous pouvez obtenir le numéro de téléphone de l'utilisateur de la manière suivante:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Incluez également CoreTelephony.framework dans votre projet. 

25
Igor

Comme vous savez probablement déjà si vous utilisez la ligne de code suivante, votre application sera rejetée par Apple. 

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

voici une référence

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

vous pouvez utiliser les informations suivantes à la place

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

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

etc

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

J'espère que cela t'aides!

22
Andres Garcia

Vous ne pouvez pas utiliser uniquement les API iOS pour capturer le numéro de téléphone (même dans une application privée avec des API privées), car toutes les méthodes connues ont été corrigées et bloquées à partir d'iOS 11. Même si un nouvel exploit est trouvé, Apple a précisez qu’elles rejetteront toutes les applications de la boutique d’applications qui utilisent des API privées pour le faire. Voir la réponse de @ Dylan pour plus de détails.

Cependant, il existe un moyen légal de capturer le numéro de téléphone sans aucune saisie de données utilisateur. Ceci est similaire à ce que fait Snapchat, mais plus facile, car il ne nécessite pas que l'utilisateur tape son propre numéro de téléphone. 

L’idée est de faire en sorte que l’application envoie par programme un message SMS à un serveur avec le code d’installation unique de l’application. L'application peut ensuite interroger le même serveur pour savoir si elle a récemment reçu un message SMS d'un périphérique avec ce code d'installation d'application unique. Si c'est le cas, il peut lire le numéro de téléphone qui l'a envoyé. Voici une vidéo de démonstration montrant le processus. Comme vous pouvez le constater, cela fonctionne à merveille!

Ce n’est pas très facile à configurer, mais il peut être configuré gratuitement en quelques heures sur un niveau AWS gratuit avec le code exemple fourni dans le tutoriel ici .

7
davidgyoung

Aucune API officielle pour le faire. En utilisant une API privée, vous pouvez utiliser la méthode suivante:

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

Cela fonctionne sur iOS 6 sans JB et signature spéciale.

Comme mentionné précédemment creker on iOS 7 avec JB, vous devez utiliser des droits pour le faire fonctionner.

Comment le faire avec les droits que vous pouvez trouver ici: iOS 7: Comment obtenir son propre numéro via une API privée?

2
0x8BADF00D

Pour obtenir votre numéro de téléphone, vous pouvez lire un fichier plist. Cela ne fonctionnera pas sur les iDevices non jailbreakés:

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]);

Je ne sais pas si Apple le permet, mais cela fonctionne sur les iPhones.

1
David Gölzhäuser

L'AppStore le rejettera, car il atteint l'extérieur du conteneur d'applications.

Les applications doivent être autonomes dans leurs ensembles et ne peuvent ni lire ni écrire des données en dehors de la zone de conteneur désignée.

Section 2.5.2: https://developer.Apple.com/app-store/review/guidelines/#software-requirements

0
thedazed