Программно получить свой номер телефона в iOS - PullRequest
321 голосов
/ 11 октября 2008

Есть ли способ получить собственный номер телефона с помощью стандартных API из iPhone SDK?

Ответы [ 10 ]

304 голосов
/ 06 ноября 2009

Рискуя получить отрицательные оценки, я хочу предположить, что решение с самым высоким рейтингом (в настоящее время первый ответ) нарушает последнее Соглашение SDK от 5 ноября 2009 года. Наше приложение было отклонено для его использования. Вот ответ от Apple:

"В целях безопасности iPhone OS ограничивает приложение (включая его настройки и данные) уникальным местоположением в файловой системе. Это ограничение является частью функции безопасности, известной как" песочница "приложения. Песочница - это набор детальных элементов управления, ограничивающих доступ приложения к файлам, настройкам, сетевым ресурсам, оборудованию и т. д. "

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

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

135 голосов
/ 11 октября 2008

Нет, законного и надежного способа сделать это нет.

Если вы найдете способ, он будет отключен в будущем, как это было с каждым методом раньше.

83 голосов
/ 22 октября 2008

Обновление: возможность, кажется, была удалена Apple на iOS 4


Просто чтобы расширить предыдущий ответ, что-то вроде этого делает это для меня:

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

Примечание : при этом извлекается «номер телефона», который был введен во время активации iPhone в iTunes и может иметь нулевое или неправильное значение. Это НЕ считывание с SIM-карты.

По крайней мере, что в 2.1. В NSUserDefaults есть пара других интересных ключей, которые также могут не сохраняться. (Это в моем приложении, которое использует UIWebView)

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

и т. Д.

Не уверен, что, если что, другие делают.

25 голосов
/ 30 августа 2012

Используя Private API, вы можете получить номер телефона пользователя следующим образом:

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

Также включите CoreTelephony.framework в ваш проект.

22 голосов
/ 25 мая 2010

Как вы, вероятно, все знаете, если вы используете следующую строку кода, ваше приложение будет отклонено 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.

Надеюсь, это поможет!

10 голосов
/ 13 июля 2018

Нельзя использовать только API-интерфейсы iOS для захвата телефонного номера (даже в частном приложении с частными API-интерфейсами), поскольку все известные способы сделать это были исправлены и заблокированы в iOS 11. Даже если обнаружен новый эксплойт, Apple ясно дала понять, что они отклонят любые приложения из магазина приложений для использования частных API для этого. Подробности смотрите в ответе Дилана.

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

Идея состоит в том, чтобы приложение программно отправляло SMS-сообщение на сервер с уникальным кодом установки приложения. Затем приложение может запросить тот же сервер, чтобы узнать, получило ли оно недавно SMS-сообщение с устройства с этим уникальным кодом установки приложения. Если это так, он может прочитать номер телефона, который его отправил. Вот демонстрационное видео , показывающее процесс. Как видите, он работает как шарм!

Это не очень просто настроить, но его можно настроить бесплатно за несколько часов на бесплатном уровне AWS с примером кода, приведенным в руководстве здесь .

2 голосов
/ 19 сентября 2014

Нет официального 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 и специальной подписи.

Как уже упоминалось Creker на iOS 7 с JB , вам нужно использовать права, чтобы он работал.

Как это сделать с правами вы можете найти здесь: iOS 7: как получить собственный номер через приватный API?

1 голос
/ 28 марта 2013

Чтобы узнать свой номер телефона, вы можете прочитать файл plist. Это не будет работать на не взломанных 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.

0 голосов
/ 30 августа 2018

AppStore отклонит его, так как он выходит за пределы контейнера приложения.

Приложения должны быть автономными в своих пакетах и ​​не могут читать или записывать данные за пределами назначенной области контейнера

Раздел 2.5.2: https://developer.apple.com/app-store/review/guidelines/#software-requirements

0 голосов
/ 23 ноября 2016

Вы не можете получить свой собственный номер телефона по какой-то причине безопасности, но вы можете получить свой номер. Сохраните его в своем списке контактов, и тогда вы сможете программно получить свой номер.

...