Программно получить собственный номер телефона в iOS

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

303
задан Stream 11 окт. '08 в 1:03
источник поделиться

10 ответов

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

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

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

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

294
ответ дан Dylan 06 нояб. '09 в 7:16
источник поделиться

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

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

130
ответ дан Andrew Grant 11 окт. '08 в 1:58
источник поделиться

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


Чтобы развернуть более ранний ответ, что-то вроде этого делает для меня:

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

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

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

WebKitJavaScriptCanOpenWindowsAutomatically
NSInterfaceStyle
TVOutStatus
WebKitDeveloperExtrasEnabledPreferenceKey

и т.д.

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

82
ответ дан Robert Sanders 22 окт. '08 в 6:09
источник поделиться

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

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

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

24
ответ дан Igor 30 авг. '12 в 17:28
источник поделиться

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

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

22
ответ дан Andres Garcia 25 мая '10 в 3:03
источник поделиться

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

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

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

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

1
ответ дан davidgyoung 13 июля '18 в 19:34
источник поделиться

Нет официального 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
ответ дан 0x8BADF00D 19 сент. '14 в 2:02
источник поделиться

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

1
ответ дан David Gölzhäuser 28 марта '13 в 12:46
источник поделиться

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

-1
ответ дан Dishant Rajput 23 нояб. '16 в 14:41
источник поделиться

Вы можете запросить у пользователя m.phone и проверить его с помощью sms. Юридически, ни один метод не знает.

-1
ответ дан erdikanik 15 авг. '15 в 13:05
источник поделиться

Другие вопросы по меткам