Програмно отримати власний номер телефону в iOS


330

Чи є спосіб отримати власний номер телефону за допомогою стандартних API від iPhone SDK?


може бути корисним для інших, хто шукає рішення, яке не використовує приватні програми " як-чи-квадрати-картка-додаток-це-робити" - використовувати ім'я пристрою для захоплення імені користувачів, просто змінити, щоб зафіксувати номер телефону або інші деталі, якщо це доречно
Нік Бернс

davidgyoung забезпечив робоче рішення. Він похований (потребує деяких оновлень).
П я

Тепер можна в Xcode , як цей stackoverflow.com/a/54004224/536214
aqavi_paracha

Відповіді:


318

Загрожуючи отримати негативні оцінки, я хочу припустити, що рішення найвищого рейтингу (на даний момент перша відповідь) порушує останню угоду про SDK від 5 листопада 2009 року. Нашу заяву було просто відхилено за її використання. Ось відповідь від Apple:

"З міркувань безпеки iPhone OS обмежує програму (включаючи її уподобання та дані) унікальним місцем розташування файлової системи. Це обмеження є частиною функції безпеки, відомої як" пісочниця програми ". зернисті елементи керування, що обмежують доступ програми до файлів, налаштувань, мережевих ресурсів, апаратних засобів тощо ".

Номер телефону пристрою недоступний у контейнері вашої програми. Вам потрібно переглянути свою програму для читання лише в контейнері каталогу та повторно надіслати свій двійковий файл до iTunes Connect, щоб ваша програма була переглянута в App Store.

Це було справжнім розчаруванням, оскільки ми хотіли пощадити користувача, який повинен ввести свій власний номер телефону.


83
Як це робить Snapchat?
rgbrgb

1
@Dylan: Коли ваш додаток відхилено. Можливо, правила переглянуті? Будь ласка, надайте корисні посилання на документацію. Однак я ціную вашу відповідь.
Абхішек Беді

1
Чи можу я отримати посилання на документацію apple.developer, де це було зазначено?
Ganesh AB - Android

3
Я ніколи не знаходив жодної документації з цього приводу, але хотів би це побачити. Це одна з тих областей, де Apple залишилася для мене непрозорою. З цього часу я не намагався подавати заявку.
Ділан

1
@rgbrgb Я не використовую Snapchat, чи можете ви пояснити їхній досвід, який так містифікує?
Вільям Ентрікен

138

Ні, немає законного і надійного способу зробити це.

Якщо ви знайдете спосіб, він буде відключений у майбутньому, як це було з кожним методом раніше.


2
Дивіться відповідь Ніка Берна: stackoverflow.com/a/8415162/292166 - є (свого роду) спосіб це зробити!
JosephH

4
Яка найкраща причина, по якій ви бачили, що Apple забороняє доступ на телефонний номер користувача на основі дозволів? Apple вже дозволяє доступ на основі дозволів до контактів, фотографій, розташування та камери та мікрофона користувача. Чому б не номер телефону? Має бути вагома причина, але це не відразу зрозуміло. Це прикро, оскільки заборона доступу змушує розробників витрачати багато часу та грошей на інші способи підтвердження номера телефону користувача.
Crashalot

86

Оновлення: можливо, Apple видалила цю програму на iOS 4 або навколо неї


Просто для розгортання попередньої відповіді, щось подібне робить це для мене:

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

Примітка . Це отримує "Номер телефону", який було введено під час активації iTunes iPhone і може бути нульовим або неправильним значенням. Це НЕ читається з SIM - карти.

Принаймні, це робиться в 2.1. У NSUserDefaults є кілька інших цікавих ключів, які також можуть не тривати. (Це в моєму додатку, яке використовує UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

і так далі.

Не впевнений, що, якщо що, роблять інші.


1
Нещодавно з'явилася преса про проблеми безпеки, що стоять за цією здатністю: theregister.co.uk/2009/09/30/iphone_security
JeffH

10
Не робіть цього. Запитайте у користувача номер за допомогою клавіатури або вибору контактів. Ви повинні зробити будь-який збір інформації максимально явним для користувача. Це може бути не найзручніше, але зберегти номер дуже просто, тому вам доведеться запитати про це лише один раз.
Девід Канарек

3
Рішення, яке відхиляє програми, не є рішенням.
averydev

27

Використовуючи приватний API, ви можете отримати номер телефону користувача наступним чином:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Також до свого проекту включіть CoreTelephony.framework.


Прочитавши інші відповіді на цьому форумі, я думав, що це неможливо, але ви зробили ідеальну роботу
Мехул Тхакар

1
КСН 7 він захищений Передбачене stackoverflow.com/questions/19504478 / ...
creker

телефон нульовий, коли я спробую це
C0D3

22

Як ви, напевно, всі готові знати, якщо ви використовуєте наступний рядок коду, ваш додаток буде відхилено 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.

Сподіваюсь, це допомагає!


9
У iOS5 також застарілий унікальний ідентифікатор. Використовуйте MAC-адресу замість цього.
Раптор

15
MOS-адреса заставлена ​​в iOS 7. Використовуйте [UIDevice identifierForVendor]замість цього.
jab

17

Ви не можете самостійно використовувати API iOS для зйомки номера телефону (навіть у приватному додатку з приватними API), оскільки всі відомі способи зробити це зафіксовано та заблоковано, як у iOS 11. Навіть якщо буде знайдено новий подвиг, Apple зробила зрозуміло, що вони відхилять будь-які програми з магазину додатків для використання приватних API для цього. Детальніше дивіться у відповіді @ Dylan.

Однак існує законний спосіб ввести номер телефону без будь-якого введення даних про користувача . Це схоже на те, що робить Snapchat, але простіше, оскільки він не вимагає від користувача вводити власний номер телефону.

Ідея полягає у тому, щоб програма програматично надсилала SMS-повідомлення на сервер із унікальним інсталяційним кодом програми. Потім програма може запитувати той самий сервер, щоб перевірити, чи нещодавно він отримав SMS-повідомлення від пристрою з цим унікальним кодом встановлення додатка. Якщо він є, він може прочитати номер телефону, який його надіслав. Ось демонстраційне відео, яке показує процес. Як бачите, це працює як шарм!

Це не дуже легко встановити, але він буде налаштований протягом декількох годин безкоштовно на вільному AWS рівні з прикладом кодом , представленим в підручнику тут .


Вибачте. Відео було випадково приватним. Зараз це публічно.
davidgyoung

Це чудовий спосіб, але ви можете, будь ласка, збагатити свою відповідь принаймні висвітлити основні деталі впровадження? Як надіслати SMS з пристрою iOS, не знаючи номер телефону? як налаштувати сервер прийому SMS, який має доступ до номера телефону відправника? Які інструменти задіяні? сумісність?
Motti Shneor

@MottiShneor, ви бачили посилання підручника у відповіді? У цьому розділі є повний підручник із налаштування цього рішення, а також робочий зразок коду програми у репортажі Github.
davidgyoung

2

Щоб отримати свій номер телефону, ви можете прочитати файл із списком. Він не працюватиме на 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.


Apple скасовує гарантію на заборонені телефони, і додаток повинен мати всюдисущі можливості для всіх користувачів.
Cosmtar

2

Жодного офіційного 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?


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.