Programowo uzyskaj własny numer telefonu w iOS

330

Czy jest jakiś sposób na uzyskanie własnego numeru telefonu za pomocą standardowych interfejsów API z iPhone SDK?

Vadim
źródło
może być przydatny dla innych, którzy szukają rozwiązania, które nie korzysta z prywatnej aplikacji typu „ jak-kwadraty-karta-aplikacja-zrób-to” - użyj nazwy urządzenia, aby przechwycić nazwę użytkownika, po prostu zmień, aby przechwycić numer telefonu lub inne odpowiednie dane
Nik Burns
davidgyoung zapewnił działające rozwiązanie. Jest pochowany (wymaga poprawek).
P i
Jest to teraz możliwe w Xcode, takie jak stackoverflow.com/a/54004224/536214
aqavi_paracha

Odpowiedzi:

318

Ryzykując uzyskanie negatywnych ocen, chcę zasugerować, że rozwiązanie najwyższej rangi (obecnie pierwsza odpowiedź) narusza najnowszą umowę SDK z 5 listopada 2009 r. Nasza aplikacja została właśnie odrzucona za jej użycie. Oto odpowiedź Apple:

„Ze względów bezpieczeństwa iPhone OS ogranicza aplikację (w tym jej preferencje i dane) do unikalnej lokalizacji w systemie plików. To ograniczenie jest częścią funkcji bezpieczeństwa znanej jako„ piaskownica aplikacji ”. Piaskownica to zestaw drobnych szczegółowe kontrole ograniczające dostęp aplikacji do plików, preferencji, zasobów sieciowych, sprzętu itp. ”

Numer telefonu urządzenia nie jest dostępny w kontenerze aplikacji. Konieczne będzie poprawienie aplikacji w celu odczytu tylko w kontenerze katalogu i ponowne przesłanie pliku binarnego do iTunes Connect, aby aplikacja została ponownie rozpatrzona w App Store.

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

Dylan
źródło
83
Jak to robi Snapchat?
rgbrgb
1
@Dylan: Kiedy Twoja aplikacja została odrzucona. Być może wytyczne zostały zmienione? Podaj przydatne linki do dokumentacji. Doceniam jednak twoją odpowiedź.
Abhishek Bedi,
1
Czy mogę uzyskać link do dokumentacji apple.developer tam, gdzie to wspomniano?
Ganesh AB - Android
3
Nigdy nie znalazłem żadnej dokumentacji na ten temat, ale chciałbym to zobaczyć. Jest to jeden z tych obszarów, w których Apple pozostawało dla mnie nieprzejrzyste. Od tego czasu nie próbowałem złożyć wniosku.
Dylan
1
@rgbrgb Nie używam Snapchata, czy możesz wyjaśnić ich tak tajemnicze doświadczenie?
William Entriken
138

Nie, nie ma legalnego i niezawodnego sposobu na zrobienie tego.

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

Andrew Grant
źródło
2
Zobacz odpowiedź Nik Burn: stackoverflow.com/a/8415162/292166 - istnieje (w pewnym sensie) sposób, aby to zrobić!
JosephH
4
Jaki jest najlepszy powód, dla którego widziałeś, że Apple nie zezwala na dostęp oparty na uprawnieniach do numeru telefonu użytkownika? Apple już zezwala na dostęp oparty na uprawnieniach do kontaktów, zdjęć, lokalizacji oraz aparatu i mikrofonu użytkownika. Dlaczego nie numer telefonu? Musi być dobry powód, ale nie jest od razu jasne. Jest to niefortunne, ponieważ zakaz dostępu powoduje, że deweloperzy spędzają dużo czasu i pieniędzy na inne sposoby weryfikacji numeru telefonu użytkownika.
Crashalot
86

Aktualizacja: wydaje się, że funkcja została usunięta przez Apple w systemie iOS 4 lub nowszym


Aby rozwinąć wcześniejszą odpowiedź, coś takiego robi to dla mnie:

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

Uwaga : pobiera „numer telefonu” wprowadzony podczas aktywacji iPhone'a w iTunes i może mieć wartość zerową lub niepoprawną. To NIE odczytać z karty SIM.

Przynajmniej tak jest w 2.1. Istnieje kilka innych interesujących kluczy w NSUserDefault, które również mogą nie trwać. (To jest w mojej aplikacji, która używa UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

i tak dalej.

Nie jestem pewien, co robią inni.

Robert Sanders
źródło
1
Ostatnio pojawiły się informacje prasowe na temat obaw związanych z bezpieczeństwem tej możliwości: theregister.co.uk/2009/09/30/iphone_security
JeffH
10
Nie rób tego Poproś użytkownika o numer za pomocą klawiatury lub narzędzia wyboru kontaktów. Powinieneś zadbać o to, by gromadzone informacje były jak najbardziej wyraźne dla użytkownika. Może nie być to najwygodniejsze, ale bardzo łatwo jest zapisać numer, więc musisz poprosić go tylko raz.
David Kanarek
3
Rozwiązanie, które odrzuca aplikacje, nie jest rozwiązaniem.
averydev
27

Korzystając z prywatnego interfejsu API, możesz uzyskać numer telefonu użytkownika w następujący sposób:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Dołącz także CoreTelephony.framework do swojego projektu.

Igor
źródło
Po przeczytaniu innych odpowiedzi na tym forum pomyślałem, że nie jest to możliwe, ale
wykonałeś
1
W systemie iOS 7 jest chroniony uprawnieniem stackoverflow.com/questions/19504478/...
creker
gdy próbuję, telefon jest zerowy
C0D3
22

Jak zapewne wszyscy już wiecie, czy użyjecie poniższego wiersza kodu, 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!

Andres Garcia
źródło
9
UniqueIdentifier jest również przestarzałe w iOS5. Zamiast tego użyj adresu MAC.
Raptor
15
Adres MAC jest przestarzały w iOS 7. Użyj [UIDevice identifierForVendor]zamiast tego.
dźgnij
17

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 zostały załatane i zablokowane od iOS 11. Nawet jeśli zostanie znaleziony nowy exploit, Apple dokonał jasne, że odrzucą wszelkie aplikacje ze sklepu z aplikacjami za używanie do tego celu prywatnych interfejsów API. Szczegółowe informacje można znaleźć w odpowiedzi @ Dylan.

Istnieje jednak legalny sposób na przechwycenie numeru telefonu bez wprowadzania danych użytkownika . Jest to podobne do działania Snapchata, ale łatwiejsze, 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 wysłać zapytanie do tego samego serwera, aby sprawdzić, czy ostatnio 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 film demonstracyjny pokazujący proces. Jak widać, działa jak urok!

To nie jest bardzo łatwy do skonfigurowania, ale być skonfigurowany w ciągu kilku godzin bez opłat na wolnym AWS tier z przykładowy kod podany w poradniku tutaj .

davidgyoung
źródło
Przepraszam. Film był przypadkowo prywatny. To jest teraz publiczne.
davidgyoung
To świetny sposób, ale czy mógłbyś wzbogacić swoją odpowiedź, tak aby obejmowała przynajmniej podstawowe szczegóły wdrożenia? Jak wysyłasz SMS-y z urządzenia z systemem iOS, nie znając swojego numeru telefonu? jak skonfigurować serwer odbierający SMS, który ma dostęp do numeru telefonu nadawcy? Jakie narzędzia są zaangażowane? zgodność?
Motti Shneor,
@MottiShneor, czy widziałeś link do samouczka w odpowiedzi? Zawiera pełny samouczek na temat konfigurowania tego rozwiązania, a także działający przykładowy kod aplikacji w repozytorium Github.
davidgyoung
2

Aby uzyskać numer telefonu, możesz przeczytać plik Plist. Nie będzie działać na urządzeniach iDevices nieobsługujących jailbreaku:

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.

David Gölzhäuser
źródło
Apple unieważnia gwarancję na telefony z jailbreakiem, a aplikacja musiałaby mieć wszechobecne możliwości dla wszystkich użytkowników.
Cosmtar
2

Brak oficjalnego API do zrobienia tego. Korzystając z prywatnego interfejsu 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 creker na iOS 7 z JB , musisz użyć uprawnień, aby to działało.

Jak to zrobić z uprawnieniami można znaleźć tutaj: iOS 7: Jak uzyskać własny numer za pośrednictwem prywatnego interfejsu API?

0x8BADF00D
źródło