Czy jest jakiś sposób na uzyskanie własnego numeru telefonu za pomocą standardowych interfejsów API z iPhone SDK?
Czy jest jakiś sposób na uzyskanie własnego numeru telefonu za pomocą standardowych interfejsów API z iPhone SDK?
Odpowiedzi:
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.
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.
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.
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.
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!
[UIDevice identifierForVendor]
zamiast tego.
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 .
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.
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?
AppStore go odrzuci, 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