Чи є спосіб отримати власний номер телефону за допомогою стандартних API від iPhone SDK?
Чи є спосіб отримати власний номер телефону за допомогою стандартних API від iPhone SDK?
Відповіді:
Загрожуючи отримати негативні оцінки, я хочу припустити, що рішення найвищого рейтингу (на даний момент перша відповідь) порушує останню угоду про SDK від 5 листопада 2009 року. Нашу заяву було просто відхилено за її використання. Ось відповідь від Apple:
"З міркувань безпеки iPhone OS обмежує програму (включаючи її уподобання та дані) унікальним місцем розташування файлової системи. Це обмеження є частиною функції безпеки, відомої як" пісочниця програми ". зернисті елементи керування, що обмежують доступ програми до файлів, налаштувань, мережевих ресурсів, апаратних засобів тощо ".
Номер телефону пристрою недоступний у контейнері вашої програми. Вам потрібно переглянути свою програму для читання лише в контейнері каталогу та повторно надіслати свій двійковий файл до iTunes Connect, щоб ваша програма була переглянута в App Store.
Це було справжнім розчаруванням, оскільки ми хотіли пощадити користувача, який повинен ввести свій власний номер телефону.
Ні, немає законного і надійного способу зробити це.
Якщо ви знайдете спосіб, він буде відключений у майбутньому, як це було з кожним методом раніше.
Оновлення: можливо, Apple видалила цю програму на iOS 4 або навколо неї
Просто для розгортання попередньої відповіді, щось подібне робить це для мене:
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
Примітка . Це отримує "Номер телефону", який було введено під час активації iTunes iPhone і може бути нульовим або неправильним значенням. Це НЕ читається з SIM - карти.
Принаймні, це робиться в 2.1. У NSUserDefaults є кілька інших цікавих ключів, які також можуть не тривати. (Це в моєму додатку, яке використовує UIWebView)
WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey
і так далі.
Не впевнений, що, якщо що, роблять інші.
Використовуючи приватний API, ви можете отримати номер телефону користувача наступним чином:
extern NSString* CTSettingCopyMyPhoneNumber();
+(NSString *) phoneNumber {
NSString *phone = CTSettingCopyMyPhoneNumber();
return phone;
}
Також до свого проекту включіть CoreTelephony.framework.
Як ви, напевно, всі готові знати, якщо ви використовуєте наступний рядок коду, ваш додаток буде відхилено Apple
NSString *num = [[NSUserDefaults standardUserDefaults] stringForKey:@"SBFormattedPhoneNumber"];
ось довідка
http://ayeapi.blogspot.com/2009/12/sbformatphonenumber-is-lie.html
ви можете використовувати наступну інформацію замість цього
NSString *phoneName = [[UIDevice currentDevice] name];
NSString *phoneUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];
і так далі
@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.
Сподіваюсь, це допомагає!
[UIDevice identifierForVendor]
замість цього.
Ви не можете самостійно використовувати API iOS для зйомки номера телефону (навіть у приватному додатку з приватними API), оскільки всі відомі способи зробити це зафіксовано та заблоковано, як у iOS 11. Навіть якщо буде знайдено новий подвиг, Apple зробила зрозуміло, що вони відхилять будь-які програми з магазину додатків для використання приватних API для цього. Детальніше дивіться у відповіді @ Dylan.
Однак існує законний спосіб ввести номер телефону без будь-якого введення даних про користувача . Це схоже на те, що робить Snapchat, але простіше, оскільки він не вимагає від користувача вводити власний номер телефону.
Ідея полягає у тому, щоб програма програматично надсилала SMS-повідомлення на сервер із унікальним інсталяційним кодом програми. Потім програма може запитувати той самий сервер, щоб перевірити, чи нещодавно він отримав SMS-повідомлення від пристрою з цим унікальним кодом встановлення додатка. Якщо він є, він може прочитати номер телефону, який його надіслав. Ось демонстраційне відео, яке показує процес. Як бачите, це працює як шарм!
Це не дуже легко встановити, але він буде налаштований протягом декількох годин безкоштовно на вільному AWS рівні з прикладом кодом , представленим в підручнику тут .
Щоб отримати свій номер телефону, ви можете прочитати файл із списком. Він не працюватиме на 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]);
Я не знаю, чи дозволяє це Apple, але це працює на iPhone.
Жодного офіційного API для цього. За допомогою приватного API можна використовувати наступний метод:
-(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;
}
Він працює на iOS 6 без JB та спеціального підписання.
Як згадував крекер на iOS 7 з JB, вам потрібно використовувати права, щоб він працював.
Як це зробити з правами, які ви можете знайти тут: iOS 7: Як отримати власний номер через приватний API?
AppStore буде відхиляти його, оскільки він потрапляє поза контейнер програми.
Додатки повинні міститись у своїх пакетах і не можуть читати чи записувати дані за межами визначеної області контейнера
Розділ 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements