Есть ли способ получить собственный номер телефона с помощью стандартных 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
и так далее.
Не уверен, что делают другие.
Используя Private 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 с помощью примера кода, приведенного в руководстве здесь .
Чтобы узнать свой номер телефона, вы можете прочитать файл 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/#software-requirements