Distinção entre dispositivos em sites remotos usando PHP, JavaScript e WURFL, Parte 1: Comece a usar a API PHP WURFL

Eliminando a adivinhação dos recursos de dispositivos móveis

Com o rápido crescimento da web remota, se você ainda não começou a trabalhar em um site ou aplicativo remoto com PHP, começará em breve. É quase impossível detectar os recursos de um dispositivo móvel entre os milhares oferecidos usando apenas PHP. Mas com Wireless Universal Resource FiLe (WURFL), essa tarefa, que costumava ser desafiadora, é reduzida a umas poucas chamadas de API para recuperar os dados necessários do dispositivo e usá-los com o site ou aplicativo PHP.

Chad Russell, Engenheiro de Software e Consultor , Freelance

Chad Russell é engenheiro de software e consultor há mais 13 anos, trabalhando em todas as funções de desenvolvedor a arquiteto de software, especializando-se em tecnologias de software livre e aplicativos baseados na web. Com um grande foco em PHP, MySQL e JavaScript, sua experiência abrange um amplo conjunto de segmentos de mercado, de pequenos negócios a empresas Fortune 500. Além do desenvolvimento, ele é coautor de dois livros sobre MySQL.



27/Fev/2012

À medida que a computação móvel continua a crescer, em número de dispositivos e de usuários, estão sendo desenvolvidos mais e mais sites da web ou aplicativos da web exclusivos ou específicos para dispositivos móveis. Ter o registro de todos esses dispositivos, as versões de seus sistemas operacionais, os recursos que cada dispositivo tem etc. pode ser uma tarefa desafiadora. Navegadores móveis modernos, associados a padrões e tecnologias emergentes como HTML5 e CSS3, estão fazendo com que a especificidade dos dispositivos seja uma preocupação menor. No entanto, ainda existem (e provavelmente sempre existirão) idiossincrasias entre os dispositivos, e é essencial ter essas informações à disposição.

Embora algumas tarefas rudimentares, como detecção de navegador, sejam fáceis de fazer com PHP ou JavaScript, muitas informações continuam sendo desconhecidas em relação aos possíveis dispositivos móveis que estão acessando o site ou aplicativo. Poder detectar se um dispositivo suporta Adobe® Flash®, quais recursos de Ajax ele pode usar ou se suporta sprites de CSS, não é necessariamente algo que possa ser feito de forma fácil usando apenas PHP ou JavaScript.

Ao usar o Wireless Universal Resource File (WURFL — pronuncia-se "uêrful"), é possível ajustar seus sites e aplicativos para dispositivos móveis facilmente, pois você sabe exatamente o que o dispositivo pode ou não fazer. Sem o WURFL, essa tarefa seria difícil, ou mesmo impossível.

O que é o WURFL?

De WAP para WURFL

Por volta de 2001, alguns anos após o lançamento inicial de telefones com Wireless Access Protocol (WAP), ficou claro que havia muitas diferenças na maneira como os dispositivos lidavam com o conteúdo WAP. Por isso, dois desenvolvedores engenhosos — Luca Passani e Andrea Trasatti — juntaram-se para criar uma comunidade de software livre em torno de um repositório de dispositivos compartilhados, que eles chamaram de WURFL. Agora, 10 anos depois, o WURFL continua crescendo em número de dispositivos no repositório e nas várias APIs de linguagens de programação que estão disponíveis.

O WURFL é um projeto de Device Description Repository (DDR) operado pela ScientiaMobile, cujo objetivo é ser um repositório central independente de informações sobre dispositivos móveis. É usado pelo Facebook e pelo Google, e por muitas outras organizações pequenas e grandes. Informações valiosas sobre o dispositivo, como fabricante e versão do navegador móvel usado, se o dispositivo é um tablet, se suporta Flash e muito mais, podem ser encontradas no WURFL.

Em sua forma mais simples, o WURFL é um repositório de milhares de dispositivos móveis e suas respectivas capacidades. O DDR consiste em um arquivo de configuração XML associado a um conjunto de APIs, o que permite recuperar um enorme volume de informações sobre um dado dispositivo móvel com pouco esforço. Com a API PHP do WURFL, é possível começar a usar imediatamente o WURFL no desenvolvimento de PHP para dispositivos móveis.


Explorando o WURFL

Chega de falar sobre os motivos para usar WURFL e o que ele pode fazer: vamos explorar os dados dentro do WURFL e que tipo de informações podem ser obtidas com ele sobre um dado dispositivo.

Você deve se familiarizar com os tipos de dados encontrados no WURFL antes de começar a usar o DDR com a API PHP do WURFL. Lembre-se que, em sua forma mais simples, o WURFL é um arquivo XML; quando abrir o arquivo WURFL, você verá todos os dados compostos em um conjunto de nós XML. Há vários nós dentro do arquivo WURFL, mas há apenas três nós nos quais você encontrará dados sobre um dispositivo móvel específico. A Tabela 1 mostra esses nós de dispositivo.

Tabela 1. Os nós de dispositivo principais do WURFL
DescriçãoDados de exemplo
<device>O nó principal que contém informações sobre o dispositivo dado<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>Filho do nó device; contém informações sobre um recurso definido<group id="display">
<capability>Filho de um nó group; lista os recursos individuais de um dado dispositivo, especificados em um dado grupo <capability name="physical_screen_height" value="80"/>
<capability name="physical_screen_width" value="48"/>

Com a Tabela 1, é possível determinar a estrutura XML básica para cada dispositivo:

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

Por exemplo, se você examinasse o WURFL, veria a entrada de dispositivo mostrada na Listagem 1 para o Apple iPhone 4.

Listagem 1. Entrada do iPhone 4 no 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>

Nesse exemplo, pode-se ver que há dois nós-filhos group dentro do nó principal do dispositivo na entrada do iPhone 4. Esses dois nós fornecem informações detalhadas sobre os codecs de áudio e vídeo suportados no dispositivo. Mas espere: não deveria haver mais informações aqui, por exemplo se o dispositivo suporta Flash ou PDF, ou se é um tablet? Sim! De fato, essas informações podem ser encontradas no WURFL, mas devido à natureza do WURFL e da maneira como ele acumula informações existentes do dispositivo no repositório, elas obviamente não estão nessa entrada.

Como o WURFL contém milhares de especificações de dispositivo multiplicadas por seus respectivos recursos, pode rapidamente se tornar uma matriz de dados complexa de se basear e manter. No entanto, uma das coisas inteligentes sobre o WURFL é a maneira como ele gerencia essa complexidade.

Os criadores do WURFL levaram em consideração os seguintes fatos sobre dispositivos móveis:

  • Embora os navegadores sejam diferentes, eles têm muitos recursos em comum.
  • Navegadores e dispositivos vindo do mesmo fabricante geralmente evoluíram do mesmo hardware e software. Por exemplo, o Research in Motion BlackBerry Curve 9350, 9360 e 9370: os pontos em comum entre eles são muitos, e as diferenças são mínimas.
  • Dispositivos de vários fabricantes podem executar o mesmo software. Por exemplo, HTC, Motorola e Samsung têm dispositivos que executam o sistema operacional Google Android e têm um navegador baseado no software livre WebKit e no mecanismo de JavaScript V8 do Google Chrome. Portanto é provável que cada dispositivo tenha recursos semelhantes nos navegadores.

Levar tudo isso em consideração permite que o WURFL seja menos complexo e mais fácil de ser atualizado. Em sua essência, o WURFL se baseia no conceito de famílias de dispositivos. Se você procurar o primeiro dispositivo listado no arquivo WURFL, verá um dispositivo com o ID generic. Tudo no arquivo WURFL é uma ampliação desse dispositivo generic. Quando é incluído um novo dispositivo que se encaixa em uma família que já existe, ele herda todos os recursos dessa família a menos que haja algo especificamente diferente para o dispositivo, caso no qual essas informações serão incluídas.

Por exemplo, se você olhar o atributo fall_back do nó <device> no exemplo do iPhone 4 na Listagem 1, você verá que faz referência a apple_iphone_ver3_1_3—o atributo de ID de dispositivo de uma entrada de dispositivo anterior do iPhone no WURFL. Se continuar seguindo o ID para trás, verá um nó de dispositivo com o ID de atributo apple_iphone_ver1. No caminho, você encontrará informações adicionais sobre o dispositivo, como sua API de geolocalização preferencial, se suporta Adobe Flash Light e a resolução do monitor. Alguns dos grupos encontrados são fornecidos na Listagem 2.

Listagem 2. Grupos de dispositivos encontrados em 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 se pode ver na entrada do iPhone4 no WURFL, cada especificação para um dado dispositivo começa com o nó <device> principal. Esses nós sempre contêm o atributo de sequência de agente do usuário, um atributo de dispositivo faill_back e um atributo de ID exclusivo.

Grupos

O WURFL contém alguns grupos de dados. Esses grupos são nós-filhos do nó device, e cada um deles define um recurso que o dispositivo pode ou não suportar, assim como detalhes mais granulares sobre a capacidade encontrada dentro do nó do grupo. Os grupos que você encontrará hoje no WURFL são 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 e deprecated.

Uma lista atualizada dos grupos, bem como uma descrição completa de cada um incluindo uma análise em tabela dos recursos definidos em cada grupo (tais como o nome do recurso, tipo e descrição), pode ser encontrada no documento de ajuda do WURFL (consulte Recursos para obter um link).

Recursos

Recursos são definidos dentro de seus grupos-pai. Todos os atributos de nome de recurso são exclusivos, mesmo entre grupos, portanto nenhum nome de recurso aparecerá mais de uma vez em uma especificação de dispositivo. Além disso, recursos sempre têm um valor; o valor de um recurso é um booleano, uma sequência (mesmo uma sequência vazia) ou um número.

A Listagem 3 dá exemplos de grupos reais — com seus recursos definidos — que podem ser encontrados no WURFL.

Listagem 3. O grupo product_info do WURFL e seus recursos
<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>

Aqui temos o grupo mais comum, product_info. Como você pode ver, é possível localizar informações básicas sobre o dispositivo, como o modelo e nome da marca, se o dispositivo tem uma touch screen e qual o perfil do agente do usuário.

Outro grupo comum é display, mostrado na Listagem 4, que fornece detalhes sobre as dimensões e resolução da tela do dispositivo. Essas informações são particularmente úteis quando se quer exibir um site móvel ou aplicativo da web corretamente em um determinado dispositivo, em vez de abandonar à sorte.

Listagem 4. Localizando informações sobre a tela dos dispositivos no 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>

Com esses dois grupos, podemos ver que o dispositivo suporta documentos PDF (consulte a Listagem 5) bem como a plataforma Java™ 2, Mobile Edition (J2ME). Novamente, podemos ver como é útil ter essas informações sobre o dispositivo que está conectando à disposição sem precisar adivinhar ou escrever código adicional para verificar esses recursos.

Listagem 5. Verificando se um determinado dispositivo suporta 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>

Trabalhando com a API PHP

A API PHP que o projeto WURFL fornece torna fácil começar a usar o WURFL no desenvolvimento de PHP. (Consulte a seção Recursos para obter um link para download da mais recente API PHP do WURFL.) O exemplo a seguir mostra como é possível recuperar um recurso de um determinado dispositivo móvel de forma rápida e fácil.

Nesse exemplo, usamos o método getCapability para passar os nomes de alguns recursos diferentes encontrados dentro do WURFL. Recuperamos o nome da marca e do modelo, a altura e largura da resolução do dispositivo e se o dispositivo pode suportar PDFs e Flash. Este exemplo supõe que você fez o download e extração da API PHP do WURFL para a raiz do servidor da web; o código pode ser encontrado na Listagem 6 dentro do diretório demo, dentro do diretório de nível superior da API PHP do WURFL.

Listagem 6. Código demo para o exemplo da 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();

Obtendo o repositório WURFL mais recente

A versão mais recente do WURFL pode ser encontrada na página do projeto no SourceForge (consulte Recursos para obter um link). Ao começar a usar o DDR no seu aplicativo PHP, certifique-se sempre de que está usando a versão mais atualizada. A atualização do WURFL é fácil: basta fazer o download da versão mais recente e substituir o arquivo wurfl.xml existente. Embora um arquivo de correção esteja disponível, a substituição do arquivo wurfl.xml existente é a abordagem recomendada.

Primeiro, configure o caminho apropriado para o arquivo application.php (fornecido com a API PHP do WURFL) bem como o arquivo XML do WURFL. Em seguida, crie o objeto Manager do WURFL. As chamadas para recuperar informações específicas do dispositivo são recuperadas desse objeto.

Com o objeto Manager criado, consulte o WURFL para obter alguns dados, como mostra a Listagem 7.

Listagem 7. Consultando os dados do WURFL
// Esta linha detecta o dispositivo visitante ao ver sua Solicitação de 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>

Quando eu carrego essa página no meu iPhone 4, eu vejo o ID do dispositivo, sua marca e modelo, informações da tela, e se ele suporta PDF e Flash. A Figura 1 mostra os resultados.

Figura 1. Resultados do código de exemplo no iPhone 4
Image showing the browser results in iPhone 4

Com esse exemplo, podemos ver que para recuperar o valor de um recurso para um dispositivo, basta chamar o método getCapability com o nome apropriado do recurso.


Conclusão

Com este artigo, você pode ver que há muito valor no uso do WURFL em seu site ou aplicativo para dispositivos móveis. Obter rápida e facilmente informações sobre um determinado dispositivo em vez de investir horas de programação adicional e muitas linhas adicionais de código para dados que, de outra forma, não poderiam ser recuperados, é de longe, a parte atrativa desse eficiente DDR.

A parte 2 desta série de artigos irá se aprofundar mais sobre a API PHP do WURFL e fornecerá exemplos de como ele pode ser colocado em uso no desenvolvimento de PHP para dispositivos móveis.

Recursos

Aprender

Obter produtos e tecnologias

  • Faça download do repositório mais recente do WURFL.
  • Faça download da API PHP do WURFL mais recente.
  • Faça o download e experimente o IBM Mobile Technology Preview, um conjunto de amostras de código e serviços para ajudá-lo a começar a desenvolver aplicativos remotos que ampliam e se integram à sua empresa. A visualização inclui um serviço de notificação RESTful; PhoneGap, uma estrutura de software livre para o desenvolvimento de aplicativos híbridos remotos; um tempo de execução WebSphere Application Server leve; e amostras de código para que você possa ver como tudo funciona.
  • Feature Pack do IBM WebSphere Application Server para Web 2.0 e Móvel inclui o IBM Dojo 1.7 Toolkit, novos blocos de construção rich Internet application (RIA) e remoto e um componente de diagrama com base em Dojo. Com as ferramentas acompanhantes do Rational, o Feature Pack o ajuda e adaptar e implantar aplicativos WebSphere desenvolvidos originalmente para navegadores desktop em dispositivos móveis.
  • Avalie os produtos IBM da maneira que for melhor para você: faça o download de uma versão de avaliação, avalie um produto online, use um produto em um ambiente de nuvem ou passe algumas horas na SOA Sandbox aprendendo a implementar Arquitetura Orientada a Serviços de modo eficiente.

Discutir

  • Participe da Comunidade do developerWorks. Junte-se a outros usuários do developerWorks ao explorar os blogs, fóruns, grupos e wikis criados por desenvolvedores.

Comentários

developerWorks: Conecte-se

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


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

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

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre, Desenvolvimento da Web
ArticleID=795392
ArticleTitle=Distinção entre dispositivos em sites remotos usando PHP, JavaScript e WURFL, Parte 1: Comece a usar a API PHP WURFL
publish-date=02272012