Как определить, какое устройство iOS использует мой пользователь?

Я ищу способ определить устройство, на котором работает мое приложение. Меня не интересует версия ПО. Я искал много вопросов, но ни один из них (на удивление) не удовлетворяет мои потребности по следующим причинам:

Решение 1.

NSString *deviceType = [UIDevice currentDevice].model;

Это не работает, потому что это дает мне просто «iPad». Я хочу знать, iPad ли это, iPad 2, новый iPad, iPhone 3GS, iPhone4 и т. д.

Решение 2. Не тестировать тип устройства, а проверять индивидуальные возможности

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

Решение 3. Использование UIDeviceHardware, найденного здесь

Этот код выглядит довольно устаревшим и, похоже, обращается к личным данным на устройстве. Есть даже споры о том, будет ли одобрено приложение, использующее это, или нет. Что еще более важно, я понятия не имею, как это работает :) Альтернатива также находится здесь

Являются ли какие-либо из последних двух, которые я упомянул, безопасными для использования? Соответствуют ли они требованиям будущего? Соответствуют ли они правилам одобрения Apple?

Или есть другой способ обойти это?

Заранее спасибо.


person Murat Ögat    schedule 01.09.2012    source источник


Ответы (3)


Apple использует такой API в своем примере кода. Процитировать пример проекта LargeImageDownsizing в файле LargeImageDownsizingViewController.m, начиная со строки 83:

Можно выбрать подходящий результирующий размер изображения и размер плитки, но это остается на усмотрение разработчика. Обратите внимание, что строку типа/версии устройства (например, «iPhone2,1» можно определить во время выполнения с помощью функции sysctlbyname:

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString* _platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
free(machine);

_platform в моем случае будет iPod4,1 для iPod touch 4-го поколения.

Этот код лежит в основе обоих примеров Github, которые вы опубликовали.

person NJones    schedule 01.09.2012
comment
Спасибо. Теперь, когда я знаю, что это безопасно, я включил его в свой проект и решил проблему. - person Murat Ögat; 01.09.2012

Технически [UIDeviceHardware platform] должен работать нормально, и вы должны отправить его на свой сервер как есть. Вы также должны отправить версию iOS вместе с идентификатором платформы, чтобы уберечь вас от проблем, если идентификатор платформы изменится в будущей ОС.

Поскольку используемая здесь функция sysctlbyname хорошо задокументирована, я не думаю, что Apple может использовать правило номер 2.5 против вас. Однако существует еще правило № 17.1:

17.1 Приложения не могут передавать данные о пользователе без получения предварительного разрешения пользователя и предоставления пользователю доступа к информации о том, как и где будут использоваться данные.

Можно спорить о том, предназначена ли платформа устройства для пользователя или нет. Мой совет: вы должны отправить приложение, предполагая, что вы не нарушаете 17.1, и никогда не упоминайте об этом. Весьма вероятно, что рецензент не будет знать, что вы делаете за кулисами.

person tia    schedule 01.09.2012
comment
Спасибо. Я агрегирую данные, которые собираю, и не привязываю их к пользователю, поэтому я не думаю, что это противоречит правилу 17.1. Я также уверен, что они даже не заметят. - person Murat Ögat; 01.09.2012

Упомянутое вами UIDeviceHardware достаточно хорошо, но немного устарело. Вы можете попробовать это. Сделано в стиле Apple, так что, возможно, им понравится больше.

person eagle.dan.1349    schedule 20.09.2012