Detectar dispositivo móvil con PHP

Diferenciar entre dispositivos móviles y navegadores de escritorio con PHP

Un dilema a la hora de desarrollar contenidos para móviles es cómo diferenciar entre dispositivos móviles y navegadores de escritorio. La manera adecuada de hacer esto es usando una base de datos de todos los dispositivos móviles que existen, tales como DeviceAtlas ó WURFL (acá se explica cómo). Pero existen algunos inconvenientes.

Menos mal que siempre en el desarrollo de aplicaciones existen soluciones alternas (claro no tan fiables en este caso) que cubren esta necesidad.

El siguiente código PHP detecta el dispositivo móvil que está solicitando una petición a nuestra web y de acuerdo a ello mostrará un contenido más compacto y ligero.

El código se basa en una lista de los más conocidos navegadores móviles (alrededor de 90) y algunos casos especiales para Opera Mini, estándares W3C y algunos navegadores para Windows.

He probado este código con un navegador de escritorio y 2 navegadores móviles distintos. El resultado ha sido favorable.

<?php
$mobile_browser = '0';

//$_SERVER['HTTP_USER_AGENT'] -> el agente de usuario que está accediendo a la página.
//preg_match -> Realizar una comparación de expresión regular

if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone)/i',strtolower($_SERVER['HTTP_USER_AGENT']))){
$mobile_browser++;
}

//$_SERVER['HTTP_ACCEPT'] -> Indica los tipos MIME que el cliente puede recibir.
if((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml')>0) or
((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))){
$mobile_browser++;
}

$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
$mobile_agents = array(
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
'wapr','webc','winw','winw','xda','xda-');

//buscar agentes en el array de agentes
if(in_array($mobile_ua,$mobile_agents)){
$mobile_browser++;
}

//$_SERVER['ALL_HTTP'] -> Todas las cabeceras HTTP
//strpos -> Primera aparicion de una cadena dentro de otra
if(strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini')>0) {
$mobile_browser++;
}
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'windows')>0) {
$mobile_browser=0;
}

if($mobile_browser>0){
// Mostrar contenido para dispositivos móviles
// Estos pueden ser más ligeros: un titulo, resumen y algunos enlaces.
// Aca puede redirigir a la ruta donde este el contenido para moviles
// Por ejemplo: http://miweb.com/movil ó http://movil.miweb.com
echo 'hola navegador cell phone';
}else{
// Contenido que se puede apreciar en navegadores de escritorio
echo 'hola navegador normal';
}
?>

Este código lo subí a http://ribosomatic.com/ejemplos/ejemplo.php y pueden probarlo con su dispositivo móvil, el mensaje deberá ser: hola navegador cell phone.

Comentarios

  1. avatar ciberwap 2009-06-27 08:24:13 5 muy bueno lo probare gracias
  2. avatar Mari Carmen 2009-05-19 07:27:35 4 Hola, me ha servido mucho tu post, quería darte las gracias por compartirlo.

    Tengo una duda que igual puedes resolverme. Necesito actualizar ese listado de mobile_agents que usas, pero no encuentro donde puedo sacar un listado así. Si me pudieses decir, sería genial.

    muchas gracias
  3. avatar Gilberto Ramos 2009-02-12 07:13:07 3 Muy bueno!! gracias compañeros! muy útil la info..!
  4. avatar zegga 2009-01-05 16:17:41 2 Aqui va la version ASP 3.0

    ----------------------------------------------------

    <%
    Dim mobile_browser
    mobile_browser = "0"

    Dim HttpUserAgent
    HttpUserAgent = LCase(Request.ServerVariables("HTTP_USER_AGENT"))

    UserAgents = Array("up.browse", "up.link", "mmp", "symbian", "smartphone", "midp", "wap" ,"phone")

    For i=0 To UBound(UserAgents)
    If HttpUserAgent = UserAgents(i) Then
    mobile_browser = mobile_browser + 1
    End if
    next

    Dim ServerAccept
    ServerAccept = LCase(Request.ServerVariables("HTTP_ACCEPT"))

    Dim HttpWap
    HttpWap = LCase(Request.ServerVariables("HTTP_X_WAP_PROFILE"))

    Dim HttpProfile
    HttpProfile = LCase(Request.ServerVariables("HTTP_PROFILE"))

    If InStr(ServerAccept, "application/vnd.wap.xhtml+xml") > 0 Or HttpWap = "" Or HttpProfile = "" Then
    mobile_browser = mobile_browser + 1
    End if

    Dim mobile_ua
    mobile_ua = LCase(MID(HttpUserAgent, 1 , 4))

    Dim mobile_agents
    mobile_agents = Array("w3c","acs-","alav","alca","amoi","audi","avan","benq","bird","blac","blaz","brew","cell","cldc","cmd-","dang","doco","eric","hipt","inno","ipaq","java","jigs","kddi","keji","leno","lg-c","lg-d","lg-g","lge-","maui","maxo","midp","mits","mmef","mobi","mot-","moto","mwbp","nec-","newt","noki","oper","palm","pana","pant","phil","play","port","prox","qwap","sage","sams","sany","sch-","sec-","send","seri","sgh-","shar","sie-","siem","smal","smar","sony","sph-","symb","t-mo","teli","tim-","tosh","tsm-","upg1","upsi","vk-v","voda","wap-","wapa","wapi","wapp", "wapr","webc","winw","winw","xda","xda-")

    For i=0 To UBound(mobile_agents)
    If mobile_ua = mobile_agents(i) Then
    mobile_browser = mobile_browser + 1
    End if
    next

    Dim AllHttp
    AllHttp = LCase(Request.ServerVariables("ALL_HTTP"))

    If InStr(AllHttp, "OperaMini") > 0 Then
    mobile_browser = mobile_browser + 1
    End If

    If InStr(HttpUserAgent, "windows") > 0 Then
    mobile_browser = 0
    End if


    If mobile_browser>0 Then
    'Datos enviados por Wap

    else
    'Datos enviado vía Web
    End If
    %>
  5. avatar Maxi 2008-09-09 11:18:48 1 Muy interesante el codigo.. pero tambien existe una libreria que sirve para desarrollar sitios web para telefonos. se llama Wurfl ( http://wurfl.sourceforge.net/ ) .. esta muy buena aparte esta desarrollada para poder usarla en PHP, Java y varios lenguajes mas..

    Saludos :D

Dejar un comentario