Programowo uzyskaj własny numer telefonu w iOS

Czy Jest jakiś sposób, aby uzyskać własny numer telefonu przez standardowe API z iPhone SDK?

Author: Midhun MP, 2008-10-10

9 answers

Na ryzyko uzyskania negatywnych ocen, chcę zasugerować, że najwyższe rozwiązanie rankingowe (obecnie pierwsza odpowiedź) narusza najnowszą umowę SDK z 5 listopada 2009. Nasza aplikacja została odrzucona za jej użycie. Oto odpowiedź od Apple:

[2]}"ze względów bezpieczeństwa iPhone OS ogranicza aplikację (w tym jej preferencje i dane) do unikalnej lokalizacji w systemie plików. Ograniczenie to jest częścią funkcji bezpieczeństwa znanej jako " piaskownica aplikacji." Piaskownica to zestaw drobnoziarnistych kontrolek ograniczających dostęp aplikacji do plików, preferencji, zasobów sieciowych, sprzętu itp."

Numer telefonu urządzenia nie jest dostępny w kontenerze aplikacji. Będziesz musiał zmienić aplikację, aby tylko do odczytu w kontenerze katalogu i ponownie przesłać plik binarny do iTunes Connect, aby ponownie rozpatrzyć aplikację w App Store.

To było Prawdziwe rozczarowanie, ponieważ chcieliśmy aby oszczędzić użytkownikowi konieczności wprowadzania własnego numeru telefonu.

 323
Author: Dylan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-06 04:16:35

Nie, Nie ma na to legalnego i wiarygodnego sposobu.

Jeśli znajdziesz sposób, zostanie on wyłączony w przyszłości, tak jak miało to miejsce w przypadku każdej metody wcześniej.

 138
Author: Andrew Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 07:43:04

Aktualizacja: [[4]} zdolność wydaje się być usunięta przez Apple na lub wokół iOS 4


Żeby rozwinąć wcześniejszą odpowiedź, coś takiego robi to za mnie:

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

Uwaga: to pobiera "numer telefonu", który został wprowadzony podczas aktywacji iTunes iPhone ' a i może być null lub nieprawidłową wartością. To NIE odczytywane z karty SIM.

Przynajmniej w 2.1. Istnieje kilka innych ciekawych kluczy w NSUserDefaults, które mogą również nie ostatni. (To jest w mojej aplikacji, która używa UIWebView)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

I tak dalej.

Nie wiem, co robią inni.
 86
Author: Robert Sanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 07:41:23

Używając prywatnego API możesz uzyskać numer telefonu użytkownika w następujący sposób:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Obejmują również Coretelefonię.ramy do twojego projektu.

 28
Author: Igor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-30 14:28:04

Ponieważ prawdopodobnie wszyscy gotowi wiedzą, że jeśli użyjesz poniższej linii kodu, Twoja aplikacja zostanie odrzucona przez Apple

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

Tutaj jest odniesienie

Http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html

Zamiast tego możesz użyć następujących informacji

NSString *phoneName = [[UIDevice currentDevice] name];

NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

I tak dalej

@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.
Mam nadzieję, że to pomoże!
 23
Author: Andres Garcia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-20 18:27:41

Nie można używać samych interfejsów API systemu iOS do przechwytywania numeru telefonu (nawet w prywatnej aplikacji z prywatnymi interfejsami API), ponieważ wszystkie znane metody tego działania zostały poprawione i zablokowane od wersji IOS 11. Nawet jeśli zostanie znaleziony nowy exploit, Apple wyraźnie stwierdziło, że odrzuci wszystkie aplikacje ze sklepu app store za używanie w tym celu prywatnych interfejsów API. Zobacz odpowiedź @ Dylan po szczegóły.

Jednakże, istnieje legalny sposób przechwytywania numeru telefonu bez wprowadzania danych użytkownika. Jest to podobne do tego, co Snapchat tak, ale łatwiej, ponieważ nie wymaga od użytkownika wpisywania własnego numeru telefonu.

Chodzi o to, aby aplikacja programowo wysyłała wiadomość SMS na serwer z unikalnym kodem instalacyjnym aplikacji. Aplikacja może następnie odpytywać ten sam serwer, aby sprawdzić, czy niedawno otrzymała wiadomość SMS z urządzenia z tym unikalnym kodem instalacyjnym aplikacji. Jeśli tak, może odczytać numer telefonu, który go wysłał. Oto demo wideo pokazujące proces. Jak widać, działa jak urok!

Nie jest to bardzo łatwe do skonfigurowania, ale można go skonfigurować w kilka godzin bezpłatnie na darmowej warstwie AWS za pomocą przykładowego kodu podanego w samouczku tutaj.

 17
Author: davidgyoung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 16:59:58

Aby uzyskać numer telefonu, możesz przeczytać plik plist. Nie będzie działać na nie-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]);
Nie wiem, czy Apple na to pozwala, ale działa na iPhone ' ach.
 2
Author: David Gölzhäuser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-28 22:47:17

Brak oficjalnego API, aby to zrobić. Używając prywatnego API możesz użyć następującej metody:

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

Działa na iOS 6 bez JB i specjalnego podpisywania.

Jak wspomniano Ceker na iOS 7 z JB musisz użyć uprawnień, aby to działało.

Jak to zrobić z uprawnieniami znajdziesz tutaj: iOS 7: Jak uzyskać własny numer przez prywatne API?

 2
Author: 0x8BADF00D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:39

AppStore odrzuci ją, ponieważ dociera poza kontener aplikacji.

Aplikacje powinny być samodzielne w swoich pakietach i nie mogą odczytywać ani zapisywać danych poza wyznaczonym obszarem kontenera

Sekcja 2.5.2 : https://developer.apple.com/app-store/review/guidelines/#software-requirements

 1
Author: thedazed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-20 15:04:34