Contenido


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

Comments

Contenido de la serie:

Este contenido es la parte # de # de la serie: Sitios móviles compatibles con dispositivos, y que utilizan PHP, JavaScript y WURFL, Parte 1

Manténgase en contacto por contenidos adicionales de esta serie.

Este contenido es parte de la serie:Sitios móviles compatibles con dispositivos, y que utilizan PHP, JavaScript y WURFL, Parte 1

Manténgase en contacto por contenidos adicionales de esta serie.

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?

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();

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 para Descargar


Temas relacionados


Comentarios

Inicie Sesión o Regístrese para agregar comentarios.

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