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 https://www.ribosomatic.com/ejemplos/ejemplo.php y pueden probarlo con su dispositivo móvil, el mensaje deberá ser: hola navegador cell phone.
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 😀
Aqui va la version ASP 3.0
—————————————————-
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
%>
Muy bueno!! gracias compañeros! muy útil la info..!
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
muy bueno lo probare gracias
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
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.
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 =)
Muy bueno, gracias por compartir
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.
Muchas gracias me ha servido mucho!!!
Interesante el codigo lo voy a probar ya que necesito culminar un proyecto de este tipo…
Aquí la versión que a nosotros nos sirvio, detecta Iphone, Ipod y Ipad.
(kliaki.com – desarrollo web)
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();
}
?>
Gracias me sirvio de mucha ayuda ¡¡¡
hola! me urge esto, soy muuy principiante, donde se supone que pongo ese codigo?? en el index???
Muy bueno el código!
encontrar
@Kutus todos los android dicen linux en el user agent
hola esta muy bien el codigo muchas gracias me ayudara con el proyecto q tengo muchas gracias ing y gracias ictius Ali
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){
}
Gracias.
Gracias por el código, lo adaptaré para mi proyecto. Un saludo.
Está muy bien tu código pero creo que me quedo con la clase Mobile-Detect que explica cybnet en bloogie: http://www.bloogie.es/tecnologia/programacion/499-detectar-dispositivos-moviles-y-tablets-con-php
Genial!!!… muchas gracias. Ha sido de bastante ayuda
Muy bueno me sirvio muchisimo gracias!