При разработке web-приложений, ориентированных на широкую аудиторию, достаточно часто требуется учитывать, что на сайт могут зайти и при помощи браузеров мобильных телефонов. Для таких пользователей хорошо бы предоставлять версию, оптимизированную для показа на мобильном телефоне. Как же определить, чем пользуется конкретный посетитель - мобильным телефоном или одним из "классических" браузеров? В этом посте я попытаюсь рассказать об известных мне подходах.
Теоретически, в HTML существует возможность указать альтернативный CSS для мобильных телефонов при помощи конструкции вида <link rel="stylesheet" type="text/css" media="handheld" href="mobile.css" />. Практически, далеко не все телефонные броузеры такое распознают (например, мой телефон такую конструкцию игнорирует напрочь, а краткий поиск в гугле показывает, что и не он один).
Кроме того, зачастую определять мобильный браузер приходится не на уровне HTML, а на уровне бизнес-логики приложения (например, в базе данных хранятся разные фотографии товаров - обычные либо минимизированные для показа на мобильном телефоне, и т.д.). Наконец, иногда может потребоваться знать не только тот факт, что пользователь зашёл с мобильного телефона, а ещё и получить доступ к свойствам данного телефона - возможно, получить размер экрана, узнать, "умеет" ли телефон показывать png либо что-то ещё.
Кажется очевидным, что для решения данной проблемы следует анализировать заголовок HTTP запроса "User-Agent". В случае мобильных браузеров этот заголовок будет содержать в себе название производителя и модель мобильного телефона. Однако, конкретное значение заголовка остаётся на совесть производителя. Конечно, в первом приближении можно сказать, что браузер мобильный, если User-Agent содержит в себе либо Nokia, либо Sony Ericsson, либо Motorola, и так далее, согласно конфигурируемому списку. Без сомнения, такой способ позволит определять 90 или больше процентов мобильных телефонов. А вот с оставшимися возникнут следующие проблемы: во-первых, существует вероятность забыть какой-то о каком-то экзотическом производителе; во-вторых, список придётся периодически модифицировать в связи с появлением нового производителя, ранее неизвестного широкой публике (такое, кстати говоря, случается минимум несколько раз за год). Ситуация осложнится ещё больше, если по каким-либо причинам требуется не только определять модель телефона, но ещё и получать доступ к некоторым свойствам этого телефона.
Соотвественно, требуется найти какой-то сервис, который содержит как как можно больше возможных значений User-Agent, регулярно обновляется, и, желательно, может предоставить те или иные свойства данной модели телефона.
Перечислю, что удалось нагуглить:
Над этой темой уже несколько лет работает W3C: http://www.w3.org/Mobile/CCPP/, однако какой-либо стандарт пока что отсутствует.
Существует open-source проект WURFL: http://wurfl.sourceforge.net/. WURFL - то есть Wireless Universal Resource File - это XML файл, содержащий базу данных по мобильным устройствам (при этом информацию об устройствах вносят пользователи). Для работы с этим файлом существует API на Java, на PHP и вроде даже что-то на .NET, всё распространяется по GPL (впрочем, старая версия API существует и для многих других языков - Perl, Ruby, Python...).
Вторым вариантом является DeviceAtlas, http://deviceatlas.com (создано, похоже, одним из предыдущих авторов WURFL). Информация предоставляется в наизапутаннейшем JSON файле, для работы с которым, опять же, предоставляется API на Java, .NET, PHP, Python и Ruby. Проект содержит всё то же, что и WURLF, плюс информация от производителей, операторов связи и прочих. На данный момент собрана информация по более чем 4500 устройств. Ложкой дёгтя послужит то, что проект, увы, платный. Впрочем, существует свободная девелоперская лицензия.
И первый, и второй вариант работают по примерно одинаковой схеме: помимо API, требуется скачать (и, конечно же, периодически обновлять, желательно по crontab'у) некий файл с данными (XML в первом случае, JSON во втором). Этот файл в обоих случаях должен быть доступен приложению локально, никаких web-сервисов там нет. И в том, и во втором случае наиважнейшая операция - по строке User-Agent получить какое-либо свойство телефона (список поддерживаемых свойств можно получить здесь http://wurfl.sourceforge.net/help_doc.php и здесь: http://deviceatlas.com/properties, соответственно). Конкретные примеры кода приводить не буду, так как оба API достаточно хорошо документированы и содержат нужное количество примеров.
DeviceAtlas апдейтиться, похоже, чаще (последний апдейт на момент написания - 9 июля), WURLF - несколько реже (3 июня).
Напоследок, следует отметить о некоторых тонкостях при определении телефона с OperaMini. Дело в том, что этот браузер работает фактически через прокси: запрос идёт на opera.com, который скачивает запрошенные данные, преобразует, оптимизирует и отдаёт телефону. При этом user-agent подменяется на что-то вроде "Opera Mini", узнать модель телефона по нему станет невозможно. Такую ситуацию нужно учитывать: подлинный user-agent будет находиться в заголовке X-OperaMini-Phone-UA. Такая проблема может проявиться, вообще говоря, не только с Oper'ой Mini, но определение других случаев, а также поиск способа решения предоставляем читателю.
Автор заранее благодарен за любые дополнения, комментарии, ссылки по теме.
Помогите нам делать больше полезного контента — поддержите редакцию.
Программирование «с пеленок» — 5 курсов для детей и подростков
Хотите превратить увлечение ребенка компьютером в полезное занятие? Мы составили подборку курсов для детей и подростков, которые помогут в этом. В нашем списке есть онлайн и оффлайн-занятия для разного бюджета. Они помогут познакомиться с основами программирования, созданием сайтов и игр, получить ценные знания и навыки и, возможно, станут первым шагом в будущую профессию.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.