Detectar navegación desde dispositivo móvil con PHP

La tarea de detectar las características del dispositivo desde el que un usuario accede a nuestra web puede ser un gran quebradero de cabeza. Una sencilla función en PHP que se limite simplemente a detectar si el usuario está usando un dispositivo móvil podría ser

function detectmov() { 
 if( navigator.userAgent.match(/Android/i)
 || navigator.userAgent.match(/webOS/i)
 || navigator.userAgent.match(/iPhone/i)
 || navigator.userAgent.match(/iPad/i)
 || navigator.userAgent.match(/iPod/i)
 || navigator.userAgent.match(/BlackBerry/i)
 || navigator.userAgent.match(/Windows Phone/i)
 ){
    return true;
  }
 else {
    return false;
  }
}

Con esta función podemos identificar las marcas que aparecen en el listado, no otras. ¿Y qué hay de los modelos? ¿Hay que añadir una condición para cada uno? Interminable, aunque de momento parece la única forma. Por suerte alguien ya pensó en eso y se han creado utilidades para ahorrarnos trabajo. Voy a hablar de las dos que conozco: mobileDetect y WURFL, ambas gratuitas.
mobileDetect es la mas simple, tanto que ni siquiera trae documentación. Permite realizar tests básicos (is_mobile, is_tablet) y otros como detectar marca o sistema operativo. En su página se puede obtener la lista de funciones implementadas simplemente pulsando el botón Demo. Una vez descargada copiamos el archivo MobileDetect.php en nuestra carpeta de scripts y ya podemos usarlo:

require_once './php/Mobile_Detect.php';
$detect = new Mobile_Detect;
$is_mobile_device = ($detect->isMobile() || ($detect->isTablet()));
if (!$is_mobile_device)

WURLF es mucho más potente. Permite realizar los tests básicos pero incorpora toda una batería de detección de característica (capabalities) realmente impresionante: desde la marca y modelo hasta la resolución de pantalla pasando por el soporte para viewport. Se suministra en 4 formatos: Java, PHP, Database (Tera-WURLF) y .Net. El formato Database, codificado en PHP, permite consultar en la base de datos del desarrollador (scientiamobile) los datos específicos de cada modelo. En mi caso probé la versión PHP, algo más complicada de instalar:

Se copian las carpetas /WURLF, /resources e /inc en el directorio de scripts de nuestro servidor. La carpeta /resources se halla en /examples/resources e /inc en /examples/demo/inc. A continuación abrimos el archivo /inc/wurlf_config_standard.php y cambiamos las líneas

$wurflDir = dirname(__FILE__) . '/../../../WURFL';
$resourcesDir = dirname(__FILE__) . '/../../resources';

para que apunten a los directorios mencionados. El código para detectar un dispositivo móvil quedaría así:

include_once './inc/wurfl_config_standard.php';
$wurflInfo = $wurflManager->getWURFLInfo();
$requestingDevice = $wurflManager->getDeviceForHttpRequest($_SERVER);
$is_wireless = ($requestingDevice->getCapability('is_wireless_device') == 'true');
$is_tablet = ($requestingDevice->getCapability('is_tablet') == 'true');
$is_mobile_device = ($iswireless || $istablet);
if (!$is_mobile_device)

Con lo que ya podemos redireccionar al usuario. Si por ejemplo necesitamos conocer la resolución de pantalla usaríamos:

$requestingDevice->getCapability('physical_screen_width')
$requestingDevice->getCapability('physical_screen_height')

El único requisito de esta librería, que puede dificultarnos su uso sobretodo en servidores gratuitos, es que cuando se instala genera una cache propia enorme (tarda varios minutos) que puede hacer saltar la quote de nuestra cuenta. No he comprobado si con los otros formatos ocurre lo mismo.

Enlaces: WURLF mobileDetect

No hay comentarios:

Publicar un comentario