Sitios móviles compatibles con dispositivos, y que utilizan PHP, JavaScript y WURFL, Parte 1: Comencemos a utilizar la API PHP de WURFL

Cómo evitar las adivinanzas sobre las capacidades del dispositivo móvil

Con el rápido crecimiento de la web móvil, si todavía no comenzó a trabajar en un sitio o aplicación móviles basados en PHP, pronto comenzará a hacerlo. Detectar la capacidad de un dispositivo móvil entre las miles de ofertas es casi imposible de lograr solo con PHP. Pero con el Archivo de Recurso Universal Móvil (WURFL, sigla en inglés), esta tarea que era abrumadora se convierte en una tarea tan simple como unas pocas llamadas API para recuperar los datos del dispositivo que necesita y que puede utilizar con su sitio o aplicación PHP.

Chad Russell, Software Engineer and Consultant, Freelance

Chad Russell ha trabajado como ingeniero de software y consultor durante más de 13 años. Se ha desempañado en muchas funciones, desde roles de desarrollador hasta de arquitecto de software, y se especializó en tecnologías de fuente abierta y aplicaciones basadas en la web. Con especial concentración en PHP, MySQL y JavaScript, su experiencia abarca una gran variedad de industrias, desde pequeños negocios hasta empresas de la lista Fortune 500. Además de dedicarse al desarrollo, es coautor de dos libros sobre MySQL.



13-07-2012

A medida que la computación móvil sigue creciendo, en número de dispositivos y en número de usuarios de esos dispositivos, se desarrollan cada vez más sitios web o aplicaciones web exclusivamente móviles. Realizar un seguimiento de todos estos dispositivos, de las versiones de sus sistemas operativos, de las capacidades de cada dispositivo, etc., puede ser una tarea agobiante. Los navegadores móviles modernos acoplados con tecnologías y estándares emergentes, como HTML5 y CSS3, ayudan a eliminar las preocupaciones sobre las características específicas de los dispositivos. No obstante, aún existen, y probablemente siempre existirán, muchas idiosincrasias entre los dispositivos y disponer de esa información tiene un valor incalculable.

A pesar de que algunas tareas rudimentarias, como la detección del navegador, se realizan con bastante facilidad con PHP o JavaScript, aún así quedan muchas incertidumbres sobre los posibles dispositivos móviles que acceden a su sitio o aplicación. Poder detectar si un dispositivo soporta Adobe® Flash®, las capacidades Ajax que puede utilizar o si soporta formas gráficas móviles de CSS, no es necesariamente algo que pueda determinar rápidamente solo con PHP o JavaScript.

Sin embargo, al utilizar WURFL (— en inglés, se pronuncia "were-full"), usted puede adaptar fácilmente sus sitios y aplicaciones móviles, ya que conoce con exactitud lo que el dispositivo puede y no puede hacer. Sin WURFL, esta tarea sería un desafío o sería casi imposible.

¿Qué es WURFL?

De WAP a WURFL

Alrededor del año 2001, algunos años después del primer lanzamiento del teléfono WAP (Protocolo de Acceso Inalámbrico), quedó claro que existían muchas diferencias en la forma en que los dispositivos con habilitación WAP administraban el contenido WAP. Por lo tanto, dos desarrolladores empresariales—Luca Passani y Andrea Trasatti—se unieron para crear una comunidad de fuente abierta en torno a un repositorio de dispositivo compartido que denominaron WURFL. En la actualidad, 10 años después, WURFL ha seguido creciendo tanto en el número de dispositivos del repositorio como en el número de API de lenguaje de programación disponibles.

WURFL es un proyecto de Device Description Repository (DDR) de fuente abierta, el cual es ejecutado por ScientiaMobile e intenta ser un repositorio central independiente de información sobre el dispositivo móvil. Lo utiliza Facebook y Google, como así también otras organizaciones grandes y pequeñas. La información de valor del dispositivo, como la marca y la versión del navegador móvil que se utiliza, si el dispositivo es una pizarra, si puede soportar Flash, etc., todo se puede encontrar dentro de WURFL.

De manera más simple, WURFL es un repositorio de miles de dispositivos móviles y sus respectivas capacidades. El DDR consiste en un archivo de configuración XML acoplado a un conjunto de APIs que le permiten recuperar gran cantidad de información sobre un dispositivo móvil determinado, sin realizar demasiado esfuerzo. Con la API PHP de WURFL, usted puede comenzar a utilizar fácil e inmediatamente WURFL en su desarrollo PHP móvil.


Cómo explorar WURFL

Ya hemos hablado suficiente sobre por qué utilizar WURFL y lo que puede hacer: Exploremos cómo aparecen los datos en WURFL y el tipo de información que, al usarlo, puede recopilar sobre un dispositivo determinado.

Debe familiarizarse con los tipos de datos en WURFL antes de comenzar a usar el DDR con la API PHP de WURFL. Recuerde que, de manera simple, WURFL es un archivo XML: Al abrir el archivo WURFL, observará todos los datos que componen un conjunto de nodos XML. Existen varios nodos en el archivo WURFL pero solo en tres nodos encontrará los datos de un dispositivo móvil determinado. La Tabla 1 muestra estos nodos del dispositivo.

Tabla 1. Los principales nodos del dispositivo de WURFL.
NodoDescripciónDatos de ejemplo
<device>El nodo principal que incluye información sobre el dispositivo determinado<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>Hijo del nodo de dispositivo; contiene información sobre una característica definida<group id="display">
<capability>Hijo de un nodo de grupo; enumera las capacidades individuales de un dispositivo determinado, el cual se especifica dentro de un grupo determinado <capability name="physical_screen_height" value="80"/>
<capability name="physical_screen_width" value="48"/>

En la Tabla 1, pude determinar la estructura XML básica para cada dispositivo:

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

Por ejemplo, si observa dentro de WURFL, encontrará la entrada del dispositivo que se muestra en el Listado 1 para el Apple iPhone 4.

Listado 1. Entrada WURFL para el iPhone 4
  <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>

En este ejemplo, puede observar que hay dos nodos de grupo hijos dentro del nodo de dispositivo principal para la entrada del iPhone 4. Estos dos nodos brindan información detallada sobre los codecs de audio y video soportados en este dispositivo. Pero: ¿No debería haber más información aquí, como por ejemplo, si el dispositivo soporta Flash o PDF, o si es una pizarra? ¡Sí! De hecho, puede encontrar esta información en WURFL, pero debido a la naturaleza de WURFL y a la manera en que utiliza la información del dispositivo existente en el repositorio, sin dudas, esta información no está en esta entrada.

Debido a que WURFL contiene miles de especificaciones del dispositivo, multiplicadas por sus respectivas capacidades, se puede convertir rápidamente en una matriz de datos cada vez más compleja que se puede seguir utilizando y manteniendo. No obstante, una de las características inteligentes de WURFL es la manera en que administra esta complejidad.

Los creadores de WURFL tuvieron en cuenta los siguientes datos sobre los dispositivos móviles:

  • A pesar de que los navegadores son diferentes, tienen muchas características en común.
  • Los navegadores y dispositivos del mismo fabricante normalmente se desarrollan con el mismo hardware y software. Considere el BlackBerry Curve 9350, 9360 y 9370 de Research in Motion: Las similitudes entre ellos son muchas y las diferencias son mínimas.
  • Es posible que los dispositivos de diferentes fabricantes ejecuten el mismo software. Por ejemplo, HTC, Motorola y Samsung tienen dispositivos que ejecutan el sistema operativo Android de Google y tienen navegadores basados en motores V8 JavaScript de fuente abierta de WebKit y Google Chrome. Por lo tanto, con mayor probabilidad, todos los dispositivos serán similares en términos de lo que el navegador soporta.

Al tener todo eso en cuenta, WURFL puede ser menos complejo y puede facilitar la actualización a los mantenedores. En esencia, WURFL está basado en el concepto de una familia de dispositivos. Si observa el primer dispositivo enumerado en el archivo WURFL, verá un dispositivo con el ID genérico. Todo en el archivo WURFL se genera a partir de este dispositivo genérico. Si se agrega un nuevo dispositivo que coincide con una familia de dispositivos preexistente, este hereda todas las capacidades de esa familia, a menos que exista algo específicamente diferente para ese dispositivo y, en ese caso, se agregará información para ese dispositivo determinado.

Por ejemplo, si observa el atributo fall_back del nodo <device> en el ejemplo del iPhone 4, en el Listado 1, verá que hace referencia al atributo del ID del dispositivo apple_iphone_ver3_1_3— de una entrada anterior del dispositivo iPhone en el WURFL. Si continúa revisando hacia atrás el ID, finalizará con un nodo de dispositivo con el ID de atributo apple_iphone_ver1. En todo el trayecto, encontrará información adicional sobre el dispositivo, como su API de geolocalización preferida, datos que determinan si soporta Adobe Flash Light y la resolución de visualización. Algunos de los grupos que encontrará se incluyen en el Listado 2.

Listado 2. Grupos de dispositivo en 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>

Dispositivos

Como puede observar en la entrada de WURFL para iPhone, cada especificación para un determinado dispositivo comienza con el nodo <device> principal. Estos nodos siempre contienen el atributo en cadena user-agent, un atributo de dispositivo fall_back y un tributo de ID exclusivo.

Grupos

WURFL contiene un número de grupos de datos. Estos grupos son nodos hijos del nodo de dispositivo y cada uno define una capacidad que un dispositivo puede o no puede soportar, como así también define más detalles granulares sobre la capacidad del nodo de grupo. Los grupos que encontrará hoy en WURFL son 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, smarttvy deprecated.

En el documento de ayuda de WURFL puede encontrar una lista actualizada de los grupos, como así también una descripción completa de cada uno con un desglose tabular de las capacidades definidas en el grupo determinado, como el nombre, tipo y descripción de la capacidad (consulte Recursos donde encontrará un enlace).

Capacidades

Las capacidades se definen dentro de sus grupos padres. Todos los atributos del nombre de la capacidad son exclusivos, incluso entre los grupos; por lo tanto, ningún nombre de capacidad aparecerá más de una vez en la especificación de un dispositivo. Además, las capacidades siempre tienen un valor; el valor de una capacidad es un variables booleanas, una cadena (incluso una cadena vacía) o un número.

El Listado 3 brinda ejemplos de grupos reales—con sus capacidades definidas—los cuales puede encontrar en WURFL.

Listado 3. El grupo product_info de WURFL y sus capacidades
<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>

Aquí, puede observar el grupo que se encuentra con mayor frecuencia, product_info. Como puede ver, es posible encontrar información básica sobre el dispositivo, como el modelo y la marca, como así también datos que determinan si el dispositivo tiene una pantalla táctil y un perfil user-agent.

Otro grupo que se encuentra habitualmente es display, el cual se muestra en el Listado 4, y brinda detalles sobre las dimensiones y la resolución de la pantalla del dispositivo. Esta información es muy útil cuando intenta visualizar un sitio móvil o una aplicación web de manera adecuada en un dispositivo determinado, en lugar de tener que adivinar dicha información.

Listado 4. Cómo encontrar información sobre la pantalla del dispositivo en 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>

Con estos dos grupos, puede observar que el dispositivo soporta documentos PDF (consulte Listado 5), como así también la plataforma Java™ 2 Mobile Edition (J2ME). Nuevamente, puede observar lo útil que es disponer de esta información sobre el dispositivo que se conecta, sin tener que adivinar o invertir más tiempo escribiendo el código para verificar estos recursos.

Listado 5. Cómo verificar el soporte de PDF para un dispositivo determinado
<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>

Cómo trabajar con API PHP

La API PHP que ofrece el proyecto WURFL facilita la utilización de WURFL en su desarrollo PHP. (Consulte Recursos donde encontrará un enlace para descargar la última API PHP de WURFL). El ejemplo simple que se encuentra a continuación muestra la rapidez y facilidad con la que puede recuperar una capacidad para un dispositivo móvil determinado.

Para este ejemplo, usted utiliza el método getCapability para especificar algunos nombres diferentes de capacidades encontrados en WURFL. Usted recupera la marca y el modelo, el ancho y alto de la resolución del dispositivo, y los datos que determinan si el dispositivo soporta PDF y Flash. Este ejemplo asume que usted ha descargado y extraído la API PHP de WURFL en el servidor raíz web; puede encontrar el código en el Listado 6 del directorio de demostración, dentro del directorio de nivel superior de API PHP de WURFL.

Listado 6. Código de demostración para el ejemplo de API PHP
<?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'; 

// Create WURFL Configuration from an XML config file 
$wurflConfig = new WURFL_Configuration_XmlConfig($wurflConfigFile); 

// Create a WURFL Manager Factory from the WURFL Configuration 
$wurflManagerFactory = new WURFL_WURFLManagerFactory($wurflConfig); 

// Create a WURFL Manager ($wurflManager is a WURFL_WURFLManager object) 
$wurflManager = $wurflManagerFactory->create();

Cómo obtener el último repositorio de WURFL

Puede encontrar la última versión de WURFL en la página SourceForge del proyecto (consulte Recursos donde encontrará un enlace). Una vez que comience a utilizar DDR en su aplicación PHP, siempre asegúrese de utilizar la versión más actualizada. Actualizar WURFL es fácil: Simplemente descargue la última versión y reemplace el archivo wurfl.xml existente. A pesar de que se encuentra disponible un archivo parche, reemplazar el archivo wurfl.xml existente es el procedimiento recomendado.

En primer lugar, configure el parche apropiado para el archivo application.php (proporcionado con la API PHP de WURFL), como así también el archivo WURFL XML. Luego, cree el objeto Manager de WURFL. Las llamadas para recuperar información específica del dispositivo se recuperan a partir de dicho objeto.

Con el objeto Manager de WURFL creado, realice una consulta a WURFL sobre algunos datos, como se muestra en el Listado 7.

Listado 7. Cómo realizar una consulta a WURFL sobre los datos
// This line detects the visiting device by looking at its HTTP Request ($_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>

Cuando cargo esta página en mi iPhone 4, veo el ID del dispositivo, su marca y modelo, la información de la pantalla, y los datos que determinan si soporta PDF y Flash. La Figura 1 muestra los resultados.

Figura 1. Resultados del código de ejemplo en el iPhone 4
Resultados del código de ejemplo en el iPhone 4

En este ejemplo, puede observar que la acción de recuperar el valor de una capacidad para un dispositivo es tan simple como llamar al método getCapability con el nombre de capacidad adecuado.


Conclusión

En este artículo, puede observar que la utilización de WURFL en su sitio o aplicación móviles es muy valiosa. La parte más atractiva de este poderoso DDR es la recopilación rápida y fácil de información sobre determinado dispositivo, en lugar de invertir horas adicionales de programación y muchas líneas extra de códigos para datos que, de otro modo, no hubiera podido recuperar.

La parte 2 de esta serie de artículos brindará más detalles sobre la API PHP de WURFL y ofrecerá ejemplos sobre cómo puede utilizarla en su desarrollo PHP móvil.

Recursos

Aprender

Obtener los productos y tecnologías

  • Descargue el último repositorio de WURFL.
  • Descargue la última API PHP de WURFL.
  • Descargue y pruebe IBM Mobile Technology Preview, un conjunto de muestras de códigos y servicios para ayudarlo a comenzar a desarrollar sus aplicaciones móviles que se extienden e integran a la empresa. La vista previa incluye el servicio de notificación RESTful; PhoneGap, una infraestructura de fuente abierta para desarrollar aplicaciones móviles híbridas; tiempo de ejecución de WebSphere Application Server liviano y un código de muestra para que pueda observar cómo funciona todo esto.
  • IBM WebSphere Application Server Feature Pack for Web 2.0 and Mobile incluye el kit de herramientas de IBM Dojo 1.7, bloques de construcción de nuevas aplicaciones móviles y de Internet enriquecidas (RIA, sigla en inglés), y un componente del diagrama basado en Dojo. Con herramientas Rational, Feature Pack lo ayuda a obtener aplicaciones WebSphere desarrolladas originalmente para navegadores de escritorio, y a adaptarlas e implementarlas en dispositivos móviles.
  • Evalúe productos de IBM de la manera que le convenga: descargue una evaluación de producto, pruebe un producto online, úselo en un entorno de nube o pase algunas horas en la SOA Sandbox aprendiendo a implementar la Arquitectura Orientada a Servicios con eficiencia.

Comentar

  • Participe en la comunidad developerWorks. Conéctese con otros usuarios developerWorks mientras explora los blogs, foros, grupos y wikis dirigidos a desarrolladores.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Linux
ArticleID=825645
ArticleTitle=Sitios móviles compatibles con dispositivos, y que utilizan PHP, JavaScript y WURFL, Parte 1: Comencemos a utilizar la API PHP de WURFL
publish-date=07132012