Inicio Desarrollo Web Detectar dispositivo móvil con PHP

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.

Programador y Desarrollador Web. Administrador de RibosoMatic y Proyecto Yupy. Blogger y entusiasta de la tecnología, internet, software y tutoriales para desarrollo de aplicaciones para la web ....

24 COMENTARIOS

  1. 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
    %>

  2. 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. Esta línea:
    if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']),’windows’)>0) {
    $mobile_browser=0;
    }
    con este user agent:
    Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12)

    Mostrará la página estándar no la pequeña.

    Creo que corresponde a unas handheld HP que traen Windpws

  4. Tengo una pregunta..tengo que hacer un Site aparte con las medidas reducidas para móviles y el código las direcciona?? o suficiente con el site para escritorio y el código las reduce a la medida de los móviles???

    Saludos.

  5. la verdad que esta re piola, habria que ir actualizando la lista asi podemos pegarla siempre con los moviles nuevos! te felicito, esta piola x2 =)

  6. Un código muy útil pero planteo un par de cuestiones:

    Como menciona Pollo, la línea que vuelve a asignar 0 a mobile_browser si encuentra “windows” dará falsos negativos en terminales con Windows mobile ¿Cierto?

    Propongo usar este otro comparador:
    If InStr(HttpUserAgent, “windows”) > 0 And InStr(HttpUserAgent, “mobile”) = 0 Then

    y ¿qué pasa con los sistemas GNU/linux? Mi firefox en Ubuntu lo detecta como móvil, propongo usar este código después del de windows:

    If InStr(HttpUserAgent, “linux”) > 0 Then
    mobile_browser = 0
    End if

    La pregunta es: ¿hay algún terminal móvil que use un user-agent que contenga “linux”? en este caso también dará un falso negativo.

    Si alguien tiene repuestas, las agradezco.

    Un saludo y gracias por el post.

  7. Aquí la versión que a nosotros nos sirvio, detecta Iphone, Ipod y Ipad.
    (kliaki.com – desarrollo web)

    < ?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++;
    }

    if(strstr($_SERVER['HTTP_USER_AGENT'],’iPhone’) || strstr($_SERVER['HTTP_USER_AGENT'],’iPod’) || strstr($_SERVER['HTTP_USER_AGENT'],’iPad’)){
    $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
    header( ‘location:/movil/’);
    exit();
    }else{
    // Contenido que se puede apreciar en navegadores de escritorio
    header( ‘location:/web/’);
    exit();
    }
    ?>

  8. Se puede utilizar este codigo para no cargar por ejemplo un slider si se entra de un movil ???

    Por ejemplo en medio del markup html
    if($mobile_browser< =0){

    <-- slider html -->

    }

    Gracias.

Deja un comentario