Existe-t-il un moyen d'obtenir son propre numéro de téléphone via les API standard à partir du SDK iPhone?
Existe-t-il un moyen d'obtenir son propre numéro de téléphone via les API standard à partir du SDK iPhone?
Réponses:
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.
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.
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.
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.
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!
[UIDevice identifierForVendor]
place.
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 .
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.
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?
AppStore le rejettera, car il atteint l'extérieur du conteneur d'application.
Les applications doivent être autonomes dans leurs ensembles et ne peuvent pas lire ou écrire de 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