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

330

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

Vadim
la source
peut être utile pour les autres à la recherche d'une solution qui n'utilise pas api privé est comment-fait-carrés-cardcase-app-do-ce - nom de l' appareil utilisé pour les utilisateurs de capturer le nom amendent juste pour le numéro capture de téléphone ou d' autres détails , selon le cas
Nik Burns ,
davidgyoung a fourni une solution de travail. Il est enterré (a besoin de quelques votes positifs).
P i
C'est maintenant possible dans Xcode comme ceci stackoverflow.com/a/54004224/536214
aqavi_paracha

Réponses:

318

Au risque d'obtenir des notes négatives, je veux suggérer que la solution la mieux classée (actuellement la première réponse) viole le dernier accord SDK en date du 5 novembre 2009. Notre application vient d'être rejetée pour son utilisation. 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 fonctionnalité de sécurité connue sous le nom de" sandbox "de l'application. Le sandbox est un ensemble de 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 lire uniquement dans votre conteneur d'annuaire et soumettre à nouveau votre fichier binaire à iTunes Connect afin que votre application soit réexaminée pour l'App Store.

Ce fut une vraie déception car nous voulions éviter à l'utilisateur d'avoir à entrer son propre numéro de téléphone.

Dylan
la source
83
Comment fonctionne Snapchat?
rgbrgb
1
@Dylan: Quand votre application a-t-elle été rejetée? Peut-être que les directives ont été révisées? Veuillez fournir des liens utiles vers la documentation. Cependant, j'apprécie votre réponse.
Abhishek Bedi
1
Puis-je obtenir le lien de documentation apple.developer là où cela est mentionné?
Ganesh AB - Android
3
Je n'ai jamais trouvé de documentation à ce sujet, mais j'aimerais le voir. C'est l'un de ces domaines où Apple est resté opaque pour moi. Je n'ai pas essayé de soumettre de candidature depuis.
Dylan
1
@rgbrgb Je n'utilise pas Snapchat, pouvez-vous s'il vous plaît expliquer leur expérience si mystifiante?
William Entriken
138

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

Si vous trouvez un moyen, il sera désactivé à l'avenir, comme cela s'est déjà produit avec toutes les méthodes auparavant.

Andrew Grant
la source
2
Voir la réponse de Nik Burn: stackoverflow.com/a/8415162/292166 - il y a (en quelque sorte) un moyen de le faire!
JosephH
4
Quelle est la meilleure raison pour laquelle Apple a refusé l'accès basé sur les autorisations au numéro de téléphone de l'utilisateur? Apple autorise déjà un accès basé sur les autorisations aux contacts, aux photos, à l'emplacement et à la caméra et au microphone de l'utilisateur. Pourquoi pas le numéro de téléphone? Il doit y avoir une bonne raison, mais ce n'est pas immédiatement clair. C'est dommage car interdire l'accès oblige les développeurs à consacrer beaucoup de temps et d'argent à d'autres façons de vérifier le numéro de téléphone d'un utilisateur.
Crashalot
86

Mise à jour: la capacité semble avoir été supprimée par Apple sur ou autour d'iOS 4


Juste pour développer une réponse antérieure, quelque chose comme ça le fait pour moi:

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

Remarque : Cela récupère le «numéro de téléphone» qui a été entré lors de l'activation iTunes de l'iPhone et peut être nul ou une valeur incorrecte. Il n'est PAS lu depuis la carte SIM.

Du moins, c'est le cas en 2.1. Il existe quelques autres clés intéressantes dans NSUserDefaults qui peuvent également ne pas durer. (C'est dans mon application qui utilise un UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

etc.

Je ne sais pas trop ce que les autres font.

Robert Sanders
la source
1
Il y a eu une presse récente sur les problèmes de sécurité derrière cette capacité: theregister.co.uk/2009/09/30/iphone_security
JeffH
10
Ne le fais pas. Demandez à l'utilisateur le numéro via le clavier ou contactez le sélecteur. Vous devez rendre toute collecte d'informations aussi explicite que possible pour l'utilisateur. Ce n'est peut-être pas le plus pratique, mais il est très facile d'enregistrer le numéro, vous n'avez donc qu'à le demander une seule fois.
David Kanarek
3
Une solution qui fait rejeter des applications n'est pas une solution.
averydev
27

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 à votre projet.

Igor
la source
Après avoir lu d'autres réponses sur ce forum, je pensais que ce n'était pas possible mais vous avez fait un travail parfait
Mehul Thakkar
1
Sur iOS 7, il est protégé par le droit stackoverflow.com/questions/19504478/…
creker
le téléphone est nul quand j'essaye
C0D3
22

Comme vous le savez probablement tous 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!

Andres Garcia
la source
9
uniqueIdentifier est également déconseillé dans iOS5. Utilisez plutôt l'adresse MAC.
Raptor
15
L'adresse MAC est déconseillée dans iOS 7. Utilisez-la à la [UIDevice identifierForVendor]place.
jab
17

Vous ne pouvez pas utiliser les API iOS seules 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 de le faire ont été corrigées et bloquées à partir d'iOS 11. Même si un nouvel exploit est trouvé, Apple a fait clair qu'ils rejetteront toutes les applications de l'App Store pour utiliser des API privées pour ce 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 saisisse son propre numéro de téléphone.

L'idée est que l'application envoie par SMS un message SMS à un serveur avec le code d'installation unique de l'application. L'application peut alors interroger le même serveur pour voir s'il a récemment reçu un message SMS d'un appareil 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 voir, cela fonctionne comme un charme!

Ce n'est pas super facile à installer, mais il peut être configuré en quelques heures sans frais sur un niveau AWS gratuit avec l'exemple de code fourni dans le didacticiel ici .

davidgyoung
la source
Désolé. La vidéo était accidentellement privée. C'est public maintenant.
davidgyoung
C'est un excellent moyen, mais pourriez-vous s'il vous plaît enrichir votre réponse pour couvrir au moins les détails de mise en œuvre de base? Comment envoyer un SMS depuis un appareil iOS sans connaître votre numéro de téléphone? comment configurer un serveur de réception de SMS ayant accès au numéro de téléphone de l'expéditeur? Quels outils sont impliqués? compatibilité?
Motti Shneor
@MottiShneor, avez-vous vu le lien du tutoriel dans la réponse? Cela comprend un didacticiel complet sur la configuration de cette solution ainsi qu'un exemple de code d'application fonctionnel dans un référentiel Github.
davidgyoung
2

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 autorise cela, mais cela fonctionne sur les iPhones.

David Gölzhäuser
la source
Apple annule la garantie sur les téléphones jailbreakés et une application devrait avoir une capacité omniprésente pour tous les utilisateurs.
Cosmtar
2

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

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

Comme mentionné creker sur iOS 7 avec JB, vous devez utiliser des droits pour le faire fonctionner.

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

0x8BADF00D
la source