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

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

12 ответов

Решение

Рискуя получить отрицательные оценки, я хочу предположить, что решение с самым высоким рейтингом (в настоящее время первый ответ) нарушает последнее Соглашение 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

и так далее.

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

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

extern NSString* CTSettingCopyMyPhoneNumber();


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

return phone;
}

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

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

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

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

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

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

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

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

Нет официального 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?

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

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

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

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

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

Вот как вы можете указать тип содержимого каждого UITextField. Теперь, когда вы запускаете свое приложение, каждое текстовое поле показывает тип контента, который вы выбрали в Xcode, например, для текстового поля Телефон, вы выбираете тип контента "Телефон" и т. Д.

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