it-swarm.com.de

Holen Sie sich programmgesteuert eine eigene Telefonnummer in iOS

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

311
Vadim

Auf die Gefahr hin, dass negative Noten erzielt werden, möchte ich darauf hinweisen, dass die Lösung mit dem höchsten Rang (derzeit die erste Antwort) die letzte SDK-Vereinbarung vom 5. November 2009 verletzt. Unser Antrag wurde für die Verwendung des Produkts abgelehnt. Hier ist die Antwort von Apple:

"Aus Sicherheitsgründen beschränkt das iPhone-Betriebssystem eine Anwendung (einschließlich ihrer Voreinstellungen und Daten) auf einen eindeutigen Ort im Dateisystem. Diese Einschränkung ist Teil der Sicherheitsfunktion, die als" Sandbox "der Anwendung bezeichnet wird. Die Sandbox ist ein Satz von abgestimmte Steuerelemente, die den Zugriff einer Anwendung auf Dateien, Voreinstellungen, Netzwerkressourcen, Hardware usw. begrenzen. "

.__ Die Telefonnummer des Geräts ist im Container Ihrer Anwendung nicht verfügbar. Sie müssen Ihre Anwendung so überarbeiten, dass sie nur innerhalb Ihres Verzeichniscontainers gelesen werden kann, und Ihre Binärdatei erneut an iTunes Connect senden, damit Ihre Anwendung für den App Store erneut geprüft wird.

Dies war eine echte Enttäuschung, da wir dem Benutzer die Eingabe seiner eigenen Telefonnummer ersparen wollten.

299
Dylan

Nein, dafür gibt es keine legale und zuverlässige Methode.

Wenn Sie einen Weg finden, wird er in Zukunft deaktiviert, wie es bei jeder Methode zuvor der Fall war.

135
Andrew Grant

Update: Die Funktion scheint von Apple in oder um iOS 4 entfernt worden zu sein


Um auf eine frühere Antwort einzugehen, tut es so etwas für mich:

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

Note: Mit dieser Option wird die "Telefonnummer" abgerufen, die während der iTunes-Aktivierung des iPhones eingegeben wurde. Sie kann den Wert null oder einen falschen Wert haben. 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.

Nicht sicher, was, wenn überhaupt, die anderen tun.

83
Robert Sanders

Mit der privaten API können Sie die Telefonnummer des Benutzers auf folgende Weise erhalten:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Fügen Sie auch CoreTelephony.framework in Ihr Projekt ein. 

25
Igor

Da Sie wahrscheinlich alle wissen, ob Sie die folgende Codezeile verwenden, wird Ihre App von Apple abgelehnt 

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

hier ist ein Hinweis

http://ayeapi.blogspot.com/2009/12/sbformatphonennummer-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!

22
Andres Garcia

Sie können iOS-APIs nicht allein zur Erfassung der Telefonnummer verwenden (selbst in einer privaten App mit privaten APIs), da alle bekannten Methoden ab iOS 11 gepatcht und blockiert wurden. Selbst wenn ein neuer Exploit gefunden wird, hat Apple dies vorgenommen Es ist klar, dass sie Apps aus dem App Store ablehnen werden, um private APIs zu verwenden. Weitere Informationen finden Sie in der Antwort von @Dylan.

Es gibt eine legale Möglichkeit, die Telefonnummer ohne Eingabe von Benutzerdaten zu erfassen. Dies ist ähnlich wie bei Snapchat, jedoch einfacher, da der Benutzer keine eigene Telefonnummer eingeben muss. 

Die Idee ist, dass die App eine SMS - Nachricht mit dem eindeutigen Installationscode der App programmgesteuert sendet. Die App kann dann denselben Server abfragen, um zu sehen, ob er kürzlich eine SMS - Nachricht von einem Gerät mit diesem eindeutigen App-Installationscode erhalten hat. Wenn ja, kann sie die gesendete Telefonnummer lesen. Hier ist ein Demo-Video , das den Vorgang zeigt. Wie Sie sehen, funktioniert es wie ein Zauber!

Dies ist nicht besonders einfach einzurichten, kann aber innerhalb weniger Stunden auf einem kostenlosen AWS-Tier mit dem Beispielcode aus dem Tutorial here konfiguriert werden.

7
davidgyoung

Keine offizielle API, um dies zu tun. 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 auf iOS 6 ohne JB und spezielle Signierung.

Wie bereits erwähnt - creker on iOS 7 mit JB müssen Sie Berechtigungen verwenden, damit es funktioniert.

Wie mache ich das mit Berechtigungen, die Sie hier finden: iOS 7: Wie bekomme ich eine eigene Nummer über eine private API?

2
0x8BADF00D

Um Ihre Telefonnummer zu erhalten, können Sie eine Plist-Datei lesen. Es funktioniert nicht bei nicht-jailbroken iDevices:

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.

1

AppStore lehnt es ab, da es sich außerhalb des Anwendungscontainers befindet.

Apps sollten in ihren Paketen eigenständig sein und dürfen keine Daten außerhalb des angegebenen Containerbereichs lesen oder schreiben

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

0
thedazed