Programmgesteuert eigene Telefonnummer in iOS erhalten

330

Gibt es eine Möglichkeit, eine eigene Telefonnummer über Standard-APIs vom iPhone SDK zu erhalten?

Vadim
quelle
kann für andere nützlich sein, die nach einer Lösung suchen, die nicht die How-Do-Squares-Cardcase-App-Do-This von Private API verwendet. Verwenden Sie den Gerätenamen, um den Benutzernamen zu erfassen. Ändern Sie einfach die Telefonnummer oder andere Details
Nik Burns
Davidgyoung hat eine funktionierende Lösung bereitgestellt. Es ist begraben (braucht einige Gegenstimmen).
P i
Es ist jetzt in Xcode wie diesem stackoverflow.com/a/54004224/536214
aqavi_paracha

Antworten:

318

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.

Dylan
quelle
83
Wie macht Snapchat das?
rgbrgb
1
@ Dylan: Wann wurde deine App abgelehnt? Vielleicht werden die Richtlinien überarbeitet? Bitte geben Sie nützliche Links zur Dokumentation an. Ich freue mich jedoch über Ihre Antwort.
Abhishek Bedi
1
Kann ich den Dokumentationslink von apple.developer erhalten, wo dies erwähnt wurde?
Ganesh AB - Android
3
Ich habe noch nie eine Dokumentation dazu gefunden, würde sie aber gerne sehen. Dies ist einer der Bereiche, in denen Apple für mich undurchsichtig geblieben ist. Ich habe seitdem nicht versucht, einen Antrag einzureichen.
Dylan
1
@rgbrgb Ich benutze kein Snapchat. Kannst du bitte ihre Erfahrung erklären, die so mysteriös ist?
William Entriken
138

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.

Andrew Grant
quelle
2
Siehe Nik Burns Antwort: stackoverflow.com/a/8415162/292166 - es gibt (irgendwie) eine Möglichkeit, dies zu tun!
JosephH
4
Was ist der beste Grund, warum Apple den erlaubnisbasierten Zugriff auf die Telefonnummer des Benutzers nicht zugelassen hat? Apple ermöglicht bereits den berechtigungsbasierten Zugriff auf Kontakte, Fotos, Standort sowie Kamera und Mikrofon des Benutzers. Warum nicht die Telefonnummer? Es muss einen guten Grund geben, aber es ist nicht sofort klar. Es ist bedauerlich, weil Entwickler durch das Verbot des Zugriffs viel Zeit und Geld für andere Methoden zur Überprüfung der Telefonnummer eines Benutzers aufwenden müssen.
Crashalot
86

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.

Robert Sanders
quelle
1
In letzter Zeit gab es einige Presseberichte über die Sicherheitsbedenken, die hinter dieser Fähigkeit stehen: theregister.co.uk/2009/09/30/iphone_security
JeffH
10
Tu es nicht. Fragen Sie den Benutzer über die Tastatur oder die Kontaktauswahl nach der Nummer. Sie sollten das Sammeln von Informationen für den Benutzer so explizit wie möglich gestalten. Es ist vielleicht nicht das bequemste, aber es ist sehr einfach, die Nummer zu speichern, so dass Sie nur einmal danach fragen müssen.
David Kanarek
3
Eine Lösung, bei der Apps abgelehnt werden, ist keine Lösung.
Averydev
27

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.

Igor
quelle
Nachdem ich andere Antworten in diesem Forum gelesen hatte, dachte ich, dass es nicht möglich ist, aber Sie haben perfekte Arbeit geleistet
Mehul Thakkar
1
Unter iOS 7 ist es durch die Berechtigung stackoverflow.com/questions/19504478/…
creker
Telefon ist Null, wenn ich dies versuche
C0D3
22

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!

Andres Garcia
quelle
9
uniqueIdentifier ist auch in iOS5 veraltet. Verwenden Sie stattdessen die MAC-Adresse.
Raptor
15
Die MAC-Adresse ist in iOS 7 veraltet. Verwenden Sie [UIDevice identifierForVendor]stattdessen.
Stich
17

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 .

Davidgyoung
quelle
Es tut uns leid. Video war versehentlich privat. Es ist jetzt öffentlich.
Davidgyoung
Dies ist eine großartige Möglichkeit, aber könnten Sie bitte Ihre Antwort bereichern, um zumindest die grundlegenden Implementierungsdetails abzudecken? Wie können Sie eine SMS von einem iOS-Gerät senden, ohne Ihre Telefonnummer zu kennen? Wie richten Sie einen SMS-Empfangsserver ein, der Zugriff auf die Telefonnummer des Absenders hat? Um welche Tools handelt es sich? Kompatibilität?
Motti Shneor
@MottiShneor, hast du den Tutorial-Link in der Antwort gesehen? Hier finden Sie ein ausführliches Tutorial zum Einrichten dieser Lösung sowie einen funktionierenden Beispiel-App-Code in einem Github-Repo.
Davidgyoung
2

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.

David Gölzhäuser
quelle
Apple macht die Garantie für Telefone mit Jailbreak ungültig, und eine App muss für alle Benutzer allgegenwärtig sein.
Cosmtar
2

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?

0x8BADF00D
quelle