Создание Web-сайтов, адаптированных для мобильных устройств, с использованием PHP, JavaScript и WURFL: Часть 1. Начало работы с WURFL PHP API

Определение характеристик мобильных устройств

Если вы еще не начали работать над PHP-сайтом или приложением для мобильных устройств, быстро развивающийся мобильный Интернет заставит вас это сделать. Определить характеристики конкретного мобильного устройства среди тысяч других, используя только PHP, практически невозможно. Но Wireless Universal Resource FiLe (WURFL) сводит эту задачу к нескольким простым вызовам API для извлечения необходимых данных об устройстве, которые можно использовать на вашем PHP-сайте или в приложении.

Чад Рассел, инженер-программист и консультант, Независимый разработчик

Чад Рассел работает инженером-программистом и консультантом более 13 лет, выполняя функции от разработчика до архитектора ПО и специализируясь на технологиях с открытыми исходными кодами и Web-приложениях. Его опыт, преимущественно в PHP, MySQL и JavaScript, охватывает широкий спектр отраслей, от малого бизнеса до компаний из списка Fortune 500. Он также является соавтором двух книг по MySQL.



26.11.2012

По мере роста объема мобильных вычислений, количества устройств и их пользователей создается все больше Web-сайтов и Web-приложений, предназначенных только для мобильного использования или приспособленных для мобильных устройств. Отслеживание всех таких устройств, версий их операционных систем и их характеристик может быть сложной задачей. Современные мобильные браузеры вместе с новыми стандартами и технологиями, такими как HTML5 и CSS3, позволяют уделять меньше внимания специфике мобильных устройств. Однако у мобильных устройств много специфических особенностей (и скорее всего они будут существовать всегда), информация о которых очень важна.

Несмотря на то, что некоторые элементарные задачи, такие как обнаружение типа браузера, довольно просто выполняются на PHP или JavaScript, вы по-прежнему многого не знаете о мобильных устройствах, которые обращаются к вашему Web-сайту или приложению. PHP или JavaScript сами по себе не всегда позволяют быстро определить, поддерживает ли устройство Adobe® Flash®, какие возможности Ajax оно использует и поддерживает ли оно CSS-спрайты.

Однако при помощи Wireless Universal Resource File (WURFL – произносится как "were-full"), можно легко настроить мобильные сайты и приложения, поскольку точно известно, что устройство может, а что нет. Без WURFL решить эту задачу было бы непросто или вовсе невозможно.

Что такое WURFL

От WAP к WURFL

Примерно в 2001 году, через несколько лет после появления первых телефонов, поддерживающих протокол WAP (Wireless Access Protocol), стало ясно, что существует множество вариантов обработки WAP-контента мобильными устройствами. Поэтому два разработчика корпоративных приложений, Лука Пассани (Luca Passani) и Андреа Трасатти (Andrea Trasatti), организовали сообщество приверженцев открытого исходного кода, занимающееся созданием общего репозитория устройств, названное ими WURFL. Сегодня, 10 лет спустя, WURFL продолжает пополняться как новыми устройствами в репозитории, так и доступными API для разных языков программирования.

WURFL – это осуществляемый компанией ScientiaMobile проект открытого репозитория описания устройств (Device Description Repository – DDR), который должен служить независимым центральным хранилищем информации о мобильных устройствах. Он используется такими компаниями как Facebook и Google, а также многими другими крупными и мелкими организациями. В WURFL можно найти много полезной информации об устройстве – например, тип и версию используемого мобильного браузера, является ли устройство планшетом, поддерживает ли оно технологию Flash и т.д.

В своей самой простой форме WURFL – это репозиторий тысяч мобильных устройств и соответствующих им характеристик. DDR состоит из конфигурационного XML-файла, соответствующего набору API, позволяющему легко извлекать большой объем информации о данном мобильном устройстве. Предназначенные для PHP API-интерфейсы WURFL позволяют сразу же начать использование WURFL в PHP-разработках для мобильных устройств.


Знакомство с WURFL

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

Перед началом использования DDR при помощи PHP API WURFL следует познакомиться с типами данных в WURFL. Напомним, что в своей самой простой форме WURFL представляет собой XML-файл: открыв файл WURFL, вы увидите все данные в виде набора XML-узлов. В файле WURFL имеется несколько узлов, но только в трех узлах содержатся данные о конкретном мобильном устройстве. Эти узлы приведены в таблице 1.

Таблица 1. Основные узлы устройства в WURFL
УзелОписаниеПример данных
<device>Главный узел, содержащий информацию для данного устройства<device id="htc_incredible_adr6300_ver1" user_agent="Mozilla/5.0 (Linux; U; Android 2.1-update1; en-us; ADR6300 Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2" fall_back="generic_android_ver2_1" actual_device_root="true">
<group>Дочерний узел узла device, содержащий информацию об определенной функциональности<group id="display">
<capability>Дочерний узел узла group, перечисляющий индивидуальные характеристики данного устройства, определенные в данной группе <capability name="physical_screen_height" value="80"/>
<capability name="physical_screen_width" value="48"/>

По таблице 1 можно определить базовую XML-структуру для каждого устройства:

<device>
  <group>
    <capability />
    <capability />
    <capability />
  </group>
  <group>
    <capability />
    <capability />
    <capability />
  </group>
</device>

Например, в WURFL можно найти запись для устройства Apple iPhone 4 (см. листинг 1).

Листинг 1. Запись для iPhone 4 в WURFL
  <device id="apple_iphone_ver4" user_agent="Mozilla/5.0 (iPhone; U; 
 CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, 
 like Gecko) Mobile/7D11" fall_back="apple_iphone_ver3_1_3" 
 actual_device_root="true"> 
 <group id="product_info"> 
   <capability name="model_name" value="iPhone"/> 
   <capability name="device_os_version" value="4.0"/> 
   <capability name="model_extra_info" value="4.0"/> 
   <capability name="release_date" value="2010_april"/> 
 </group> 
 <group id="playback"> 
  <capability name="playback_acodec_aac" value="lc"/> 
  <capability name="playback_mp4" value="true"/> 
  <capability name="playback_3gpp" value="true"/> 
  <capability name="playback_acodec_amr" value="nb"/> 
  <capability name="playback_acodec_qcelp" value="false"/> 
  <capability name="playback_vcodec_mpeg4_sp" value="3"/> 
  <capability name="playback_vcodec_h263_0" value="30"/> 
  <capability name="playback_3g2" value="true"/> 
  <capability name="playback_vcodec_h264_bp" value="3.0"/> 
 </group> 
 <group id="streaming"> 
  <capability name="streaming_vcodec_h263_0" value="30"/> 
  <capability name="streaming_acodec_aac" value="lc"/> 
  <capability name="streaming_3gpp" value="true"/> 
  <capability name="streaming_vcodec_h264_bp" value="3.0"/> 
  <capability name="streaming_acodec_amr" value="nb"/> 
  <capability name="streaming_preferred_protocol" value="http"/> 
  <capability name="streaming_vcodec_mpeg4_sp" value="3"/> 
  <capability name="streaming_mp4" value="true"/> 
 </group> 
</device>

Этот пример показывает, что у записи iPhone 4 в главном узле device есть два дочерних узла group. Эти два узла содержат подробную информацию об аудио и видео-кодеках, поддерживаемых данным устройством. Постойте, но, кажется, здесь должно быть больше информации, например о том, поддерживает ли устройство технологию Flash или PDF и является ли оно планшетом. Да, конечно. Вы несомненно найдете эту информацию в WURFL, но в силу устройства WURFL и применяемого в нем способа хранения информации об уже существующих в репозитории устройствах эта информация не хранится в данной записи.

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

Создатели WURFL приняли во внимание следующие особенности мобильных устройств:

  • Хотя браузеры различаются между собой, у них есть много общих функциональных возможностей.
  • Браузеры и устройства определенного производителя происходят от одного и того же аппаратного и программного обеспечения. Возьмем устройства Research in Motion BlackBerry Curve 9350, 9360 и 9370. У них много общего, а различия минимальны.
  • Устройства разных производителей могут работать с одним и тем же программным обеспечением. Например, у HTC, Motorola и Samsung есть устройства, работающие на операционной системе Google Android и использующие браузер на движке с открытым исходным кодом WebKit и механизме Google Chrome V8 JavaScript. Поэтому весьма вероятно, что все эти устройства будет походить друг на друга с точки зрения поддержки браузеров.

Все это позволяет упростить WURFL и облегчить его обслуживание и обновление. По существу WURFL основан на концепции семейства устройств. Первое устройство в WURFL-файле имеет идентификатор generic. Все содержимое WURFL-файла построено на этом обобщенном устройстве. При добавлении нового устройства в существующее семейство устройств оно наследует все характеристики этого семейства, если у него нет каких-то специфических отличий; кроме того, добавляется информация об особых отличительных свойствах, которые имеет данное конкретное устройство.

Посмотрев на атрибут fall_back узла <device> в записи iPhone 4 (листинг 1), вы заметите, что он ссылается на apple_iphone_ver3_1_3 – атрибут идентификатора записи WURFL, относящейся к устройству iPhone предыдущей модели. Если продолжать двигаться по ссылкам на идентификаторы, мы придем к узлуdevice с атрибутом ID apple_iphone_ver1. На этом пути вы обнаружите дополнительную информацию об устройстве, такую как предпочитаемый API определения географического положения, разрешение дисплея и информация о поддержке Adobe Flash Light. В листинге 2 приведены некоторые из найденных групп.

Листинг 2. Группы устройств в WURFL
<group id="ajax"> 
   <capability name="ajax_preferred_geoloc_api" value="w3c_api"/> 
</group>
<group id="display"> 
   <capability name="resolution_height" value="480"/> 
   <capability name="resolution_width" value="320"/> 
</group>
<group id="flash_lite"> 
   <capability name="flash_lite_version" value=""/> 
   <capability name="fl_wallpaper" value="false"/> 
   <capability name="fl_browser" value="false"/> 
   <capability name="fl_screensaver" value="false"/> 
   <capability name="fl_standalone" value="false"/> 
   <capability name="fl_sub_lcd" value="false"/> 
</group>

Устройства

Запись WURFL об iPhone4 показывает, что каждая спецификация конкретного устройства начинается с главного узла <device>. Такие узлы всегда содержат строковый атрибут user-agent, атрибут устройства fall_back и уникальный атрибут ID (идентификатор).

Группы

WURFL содержит несколько групп данных. Эти группы являются дочерними узлами узла device, и каждая из них определяет функциональность, которую устройство может поддерживать или не поддерживать, а также более подробные данные о функциональности в узле group. В настоящее время в WURFL имеются группы product_info, wml_ui, chtml_ui>, xhtml_ui, html_ui, css, ajax, markup, cache, display, image_format, bugs, wta, security, bearer, storage, object_download, playback, wap_push, drm, streaming, mms, j2me, sms, sound_format, flash_lite, transcoding, rss, pdf, chips, smarttv и deprecated.

Текущий перечень групп, а также их полное описание, содержащее табличную схему характеристик, определенных в данной группе (например, название, тип и описание), можно найти в справочном документе по WURFL (ссылка приведена в разделе Ресурсы).

Характеристики

Характеристики определяются в их родительских группах. Атрибуты name всех характеристик являются уникальными даже между группами, поэтому ни одно имя характеристики в спецификации устройства не повторяется. Кроме того, они всегда имеют значение; значение характеристики имеет тип Boolean, string (даже пустая строка) или number.

В листинге 3 приведены примеры реальных групп с определенными в них характеристиками, которые можно найти в WURFL.

Листинг 3. Группа WURFL product_info и ее характеристики
<group id="product_info"> 
  <capability name="pointing_method" value="touchscreen"/> 
  <capability name="uaprof" value="http://www.blackberry.net/go/mobile/
        profiles/uaprof/9500_edge/4.7.0.rdf"/> 
  <capability name="model_name" value="BlackBerry 9500"/> 
  <capability name="brand_name" value="RIM"/> 
  <capability name="model_extra_info" value="Thunder"/> 
  <capability name="marketing_name" value="Storm"/> 
</group>

Самой используемой группой является product_info. В ней приведена базовая информация об устройстве: модель и название бренда, наличие сенсорного экрана и профиль user-agent.

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

Листинг 4. Информация об экране устройства в WURFL
<group id="display"> 
   <capability name="physical_screen_height" value="66"/> 
   <capability name="columns" value="36"/> 
   <capability name="dual_orientation" value="true"/> 
   <capability name="physical_screen_width" value="50"/> 
   <capability name="max_image_width" value="340"/> 
   <capability name="rows" value="32"/> 
   <capability name="resolution_width" value="360"/> 
   <capability name="resolution_height" value="480"/> 
   <capability name="max_image_height" value="440"/> 
</group>

Две следующие группы показывают (листинг 5), что устройство поддерживает PDF-документы и Java™ 2 Platform, Mobile Edition (J2ME). Весьма полезно иметь в своем распоряжении информацию о подключающемся устройстве, а не строить догадки или тратить время на написание кода для проверки этих возможностей.

Листинг 5. Проверка поддержки PDF для конкретного устройства
<group id="pdf"> 
   <capability name="pdf_support" value="true"/> 
</group> 
<group id="j2me"> 
   <capability name="j2me_midp_2_0" value="true"/> 
   <capability name="j2me_cldc_1_0" value="true"/> 
   <capability name="j2me_cldc_1_1" value="true"/> 
   <capability name="j2me_midp_1_0" value="true"/> 
</group>

Работа с PHP API

PHP API, предоставляемый проектом WURFL, облегчает использование WURFL в ваших разработках на PHP. (Ссылка на загрузку последней версии WURFL PHP API приведена в разделе Ресурсы.) Приведенный ниже простой пример показывает, как можно быстро и просто извлечь характеристики конкретного мобильного устройства.

В примере метод getCapability применяется для передачи имен нескольких различных характеристик, найденных в WURFL. Извлекаются название и бренд модели, ширина и высота экрана и информация о поддержке PDF и Flash. Предполагается, что вы загрузили и разархивировали WURFL PHP API в папку root web-сервера; код, приведенный в листинге 6, можно найти в подкаталоге demo корневого каталога WURFL PHP API.

Листинг 6. Код демонстрационного примера PHP API
<?php

define("WURFL_DIR", dirname(__FILE__) . '/../../WURFL/'); 
define("RESOURCES_DIR", dirname(__FILE__) . "/../resources/"); 

require_once WURFL_DIR . 'Application.php'; 

$wurflConfigFile = RESOURCES_DIR . 'wurfl-config.xml'; 

// Создать WURFL Configuration из конфигурационного XML-файла
$wurflConfig = new WURFL_Configuration_XmlConfig($wurflConfigFile); 

// Создать WURFL Manager Factory из WURFL Configuration 
$wurflManagerFactory = new WURFL_WURFLManagerFactory($wurflConfig); 

// Создать WURFL Manager ($wurflManager – это объект WURFL_WURFLManager) 
$wurflManager = $wurflManagerFactory->create();

Получение последней версии репозитория WURFL

Последнюю версию репозитория WURFL можно найти на странице проекта SourceForge (ссылка приведена в разделе Ресурсы). Если вы начали использовать DDR в своих PHP-приложениях, постоянно проверяйте актуальность используемой версии. Обновить WURFL легко: просто загрузите свежую версию и замените существующий файл wurfl.xml. Рекомендуем полностью заменять существующий файл wurfl.xml, хотя доступен и файл исправлений.

Прежде всего укажите соответствующий путь к файлу application.php (предоставленному с WURFL PHP API), а также к XML-файлу WURFL. Затем создайте объект WURFL Manager. Из этого объекта извлекается информация о конкретном устройстве.

После создания объекта WURFL Manager выполняется запрос нескольких фрагментов данных в WURFL (см. листинг 7).

Листинг 7. Запрос данных в WURFL
// Эта строка определяет устройство, просматривая его HTTP-запрос ($_SERVER) 
$requestingDevice = $wurflManager->getDeviceForHttpRequest($_SERVER);

?> 

<html> 
 <body> 

  <ul> 
   <li>ID: 
    <?php echo $requestingDevice->id; ?> </li> 
     <li>Brand Name: 
          <?php echo $requestingDevice->getCapability("brand_name"); ?> </li> 
     <li>Model Name: 
          <?php echo $requestingDevice->getCapability("model_name"); ?> </li> 
     <li>Resolution Width: 
          <?php echo $requestingDevice->getCapability("resolution_width"); ?> </li> 
     <li>Resolution Height: 
          <?php echo $requestingDevice->getCapability("resolution_height"); ?> </li> 
     <li>PDF Support: 
          <?php echo $requestingDevice->getCapability("pdf_support"); ?> </li> 
     <li>Flash Support: 
          <?php echo $requestingDevice->getCapability("full_flash_support"); ?> </li> 
  </ul> 

 </body> 
</html>

При загрузке этой страницы я увижу на своем iPhone 4 идентификатор устройства, его версию и название модели, информацию об экране и информацию о поддержке PDF и Flash. На рисунке 1 показаны результаты.

Рисунок 1. Результаты выполнения примера на iPhone 4
Рисунок 1. Результаты выполнения примера на iPhone 4

Пример показывает, что извлечение характеристик устройства сводится к простому вызову метода getCapability с соответствующим именем характеристики.


Заключение

В статье показано, что использование WURFL может быть очень полезно для работы вашего мобильного сайта или приложения. Быстрый и простой сбор информации о конкретном устройстве вместо написания кода для извлечения данных, которые иногда невозможно получить, является самым привлекательным свойством этого мощного DDR.

Во второй части данной серии статей мы более подробно рассмотрим PHP API WURFL и разберем примеры его использования для разработки мобильных приложений на PHP.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Мобильные приложения, Open source
ArticleID=847221
ArticleTitle=Создание Web-сайтов, адаптированных для мобильных устройств, с использованием PHP, JavaScript и WURFL: Часть 1. Начало работы с WURFL PHP API
publish-date=11262012