Gibt es eine Möglichkeit, eine eigene Telefonnummer über Standard-APIs vom iPhone SDK zu erhalten?
Gibt es eine Möglichkeit, eine eigene Telefonnummer über Standard-APIs vom iPhone SDK zu erhalten?
Antworten:
Auf die Gefahr hin, negative Noten zu erhalten, möchte ich vorschlagen, dass die Lösung mit dem höchsten Rang (derzeit die erste Antwort) gegen die neueste SDK-Vereinbarung vom 5. November 2009 verstößt. Unser Antrag wurde gerade abgelehnt. Hier ist die Antwort von Apple:
"Aus Sicherheitsgründen beschränkt das iPhone-Betriebssystem eine Anwendung (einschließlich ihrer Einstellungen und Daten) auf einen eindeutigen Speicherort im Dateisystem. Diese Einschränkung ist Teil der Sicherheitsfunktion, die als" Sandbox "der Anwendung bezeichnet wird. Die Sandbox besteht aus einer Reihe von Fein- differenzierte Steuerelemente, die den Zugriff einer Anwendung auf Dateien, Einstellungen, Netzwerkressourcen, Hardware usw. einschränken. "
Die Telefonnummer des Geräts ist im Container Ihrer Anwendung nicht verfügbar. Sie müssen Ihre Anwendung so überarbeiten, dass sie nur in Ihrem Verzeichniscontainer schreibgeschützt ist, und Ihre Binärdatei erneut an iTunes Connect senden, damit Ihre Anwendung für den App Store erneut überprüft wird.
Dies war eine echte Enttäuschung, da wir dem Benutzer die Eingabe seiner eigenen Telefonnummer ersparen wollten.
Nein, es gibt keinen legalen und zuverlässigen Weg, dies zu tun.
Wenn Sie einen Weg finden, wird er in Zukunft deaktiviert, wie es bei jeder Methode zuvor geschehen ist.
Update: Die Funktion wurde anscheinend von Apple unter oder um iOS 4 entfernt
Nur um eine frühere Antwort zu erweitern, so etwas tut es für mich:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
Hinweis : Hiermit wird die "Telefonnummer" abgerufen, die während der iTunes-Aktivierung des iPhones eingegeben wurde und die null oder ein falscher Wert sein kann. Es wird NICHT von der SIM-Karte gelesen.
Zumindest in 2.1. Es gibt einige andere interessante Schlüssel in NSUserDefaults, die möglicherweise auch nicht von Dauer sind. (Dies ist in meiner App, die eine UIWebView verwendet)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
und so weiter.
Ich bin mir nicht sicher, was die anderen tun, wenn überhaupt.
Mit der privaten API können Sie die Telefonnummer des Benutzers auf folgende Weise abrufen:
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
Fügen Sie Ihrem Projekt auch CoreTelephony.framework hinzu.
Wie Sie wahrscheinlich alle wissen, wird Ihre App von Apple abgelehnt, wenn Sie die folgende Codezeile verwenden
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
Hier ist eine Referenz
http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html
Sie können stattdessen die folgenden Informationen verwenden
NSString *phoneName = [[UIDevice currentDevice] name];
NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];
und so weiter
@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.
Hoffe das hilft!
[UIDevice identifierForVendor]
stattdessen.
Sie können iOS-APIs nicht allein zum Erfassen der Telefonnummer verwenden (auch nicht in einer privaten App mit privaten APIs), da alle bekannten Methoden dazu ab iOS 11 gepatcht und blockiert wurden. Auch wenn ein neuer Exploit gefunden wurde, hat Apple dies vorgenommen Stellen Sie sicher, dass alle Apps aus dem App Store abgelehnt werden, wenn Sie dazu private APIs verwenden. Siehe @ Dylans Antwort für Details.
Es gibt jedoch eine legale Möglichkeit, die Telefonnummer ohne Eingabe von Benutzerdaten zu erfassen . Dies ähnelt dem von Snapchat, ist jedoch einfacher, da der Benutzer keine eigene Telefonnummer eingeben muss.
Die App soll programmgesteuert eine SMS-Nachricht mit dem eindeutigen Installationscode der App an einen Server senden. Die App kann dann denselben Server abfragen, um festzustellen, ob sie kürzlich eine SMS-Nachricht von einem Gerät mit diesem eindeutigen App-Installationscode erhalten hat. Wenn dies der Fall ist, kann es die Telefonnummer lesen, die es gesendet hat. Hier ist ein Demo-Video, das den Prozess zeigt. Wie Sie sehen können, funktioniert es wie ein Zauber!
Dies ist nicht sehr einfach einzurichten, kann jedoch in wenigen Stunden kostenlos auf einer kostenlosen AWS-Ebene mit dem im Tutorial hier bereitgestellten Beispielcode konfiguriert werden .
Um Ihre Telefonnummer zu erhalten, können Sie eine Plist-Datei lesen. Es funktioniert nicht mit iDevices ohne 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]);
Ich weiß nicht, ob Apple dies zulässt, aber es funktioniert auf iPhones.
Keine offizielle API dafür. Mit der privaten API können Sie folgende Methode verwenden:
-(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;
}
Es funktioniert unter iOS 6 ohne JB und spezielle Signatur.
Wie bereits erwähnt, müssen Sie unter iOS 7 mit JB Berechtigungen verwenden, damit es funktioniert.
Wie es mit Berechtigungen geht, finden Sie hier: iOS 7: Wie erhalte ich eine eigene Nummer über eine private API?
AppStore lehnt es ab, da es außerhalb des Anwendungscontainers liegt.
Apps sollten in ihren Bundles in sich geschlossen sein und dürfen keine Daten außerhalb des festgelegten Containerbereichs lesen oder schreiben
Abschnitt 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements