移动检测[关闭]

Posted

技术标签:

【中文标题】移动检测[关闭]【英文标题】:Mobile detection [closed] 【发布时间】:2010-10-19 02:12:46 【问题描述】:

有没有办法使用 javascript 检测移动设备?另外,我研究了有这样一个 XML 包含可以帮助识别手机的用户代理。

【问题讨论】:

这不是重复的。它与建议的重复文章略有不同。重复的文章讨论了屏幕分辨率,这个问题是关于一般检测移动设备的。 这不是建设性的吗?它可能是某些东西的复制品(可能是一些),但它绝对是建设性的。 管理员似乎对在此处发帖的要求非常狭窄和精确。 【参考方案1】:

您可能有一个普通网站,如果满足某些条件,您可能希望重定向到移动网站,例如屏幕非常小,或者内容被缩小以适合小物理屏幕中的大“虚拟”屏幕空间。那么,为什么不检查这些条件而不是测试无数的 UA 字符串。

试试这样的:

为了让 UA 报告屏幕的物理像素大小,该标签必须存在于 html 页面中。 *

<meta name="viewport" 
      content="width=device-width, initial-scale=1, maximum-scale=1" />

现在,只需获取屏幕大小并在需要时重定向即可。使用轻微的延迟。 **

setTimeout(function()
  if ((screen.width < 480) || (screen.height < 480)) 
    location.replace('/mobile/');
  
, 100);

差不多就是这样。由于此页面已经为移动设备设置了 viewport 标签,您也可以反过来,在此处显示移动设备,如果屏幕更大,则重定向到整个网站。

编辑:我不确定为什么这个问题已经关闭;据我所知,它非常适合 SO 格式。投票决定重新开放。

* 用 javascript 插入它似乎不起作用(如果你想出办法,请纠正我)。如果它不存在,手机将报告一个大于实际屏幕的虚拟屏幕尺寸。它似乎也不适用于 iframe,只有***窗口(这是有道理的,因为 iframe 需要缩放与外部窗口相同的数量,它们共享相同的视口)。

** 一些移动浏览器会保留上次加载页面的视口大小,因此它们会在几毫秒内报告较大的虚拟屏幕大小,直到它们注意到我猜的元标记。我找不到一个早期的事件来解决这个问题,如果你有更好的方法,请发表评论。在我所有的测试中,50 毫秒的延迟都很好,100 应该是安全的。

【讨论】:

哇,真的很巧妙的解决方案.. 我猜有点丑,但绝对是一种有趣的方法:) 不幸的是,随着像素密度越来越高,我想这并不是最好的主意。像素并不能代表实际的物理尺寸……嗯。 像素密度不会影响它,因为大多数(可能到目前为止)具有密集像素的设备报告的像素数量少于它们实际包含的像素数量,并且单独报告像素密度。【参考方案2】:

这是一个移动检测 Javascript,我可以保证即使使用像 Opera MIni 这样的瘦客户端也能很好地工作(免责声明:我写的):

https://github.com/miohtama/detectmobile.js

【讨论】:

【参考方案3】:

插入Handset Detection。您可以使用 Javascript、php 或最流行的脚本语言。我们处理痛苦,因此您不必 :-) 免责声明 - 我在那里工作。

【讨论】:

【参考方案4】:

我推荐浏览器嗅探代码的最后一个地方是移动设备。现在是狂野的西部,没有人在阅读同一本规则书。我听说一些浏览器正在模仿其他用户代理以避免嗅探将它们排除在外的代码,就像 IE 曾经在 90 年代一样。

如果您还不知道它的含义,请按方法和谷歌渐进增强进行测试。 JS 的一些浏览器实现如此混乱,不值得尝试适应,应该提供没有 JS,IMO 的网站版本。

只需看看 JQuery 的核心团队在他们的分级兼容性表中认为 C 级(不值得支持)的内容。是的,我相信这适用于核心和 JQ 移动库(有点像移动的 JQ ui,而不是移动的 JQ 核心 - 仍然需要核心才能工作)。

http://jquerymobile.com/gbs/

【讨论】:

【参考方案5】:

我写了一个名为“redirection_mobile.js”的JS脚本来解决这个问题。如果您从移动设备访问站点,它会检​​测用户代理并重定向到移动版本。

在某些情况下,您希望从移动设备重定向到桌面版本(例如使用“转到主站点”链接),脚本会处理该问题,一旦您完成会话,您就可以访问又是手机版。

您可以在 github 上找到源代码 https://github.com/sebarmeli/JS-Redirection-Mobile-Site,您可以在我的一篇文章中阅读更多详细信息:

http://blog.sebarmeli.com/2010/11/02/how-to-redirect-your-site-to-a-mobile-version-through-javascript/

【讨论】:

我感谢所有警告浏览器嗅探的人,但是当您只想将移动设备发送到为其优化的站点时,功能检测无法正常工作。我们的应用程序服务器前面有 squid,需要一个免费的 javascript 解决方案——这个符合要求。谢谢!【参考方案6】:

我有这个来自 K2F 的代码,它在 PHP 中,你必须将它转换为 javascript。

应该不会太麻烦。了解常量(文本位)应该会对您有很大帮助。

/**
 * A simple class used to detect whether page<br>
 * is being viewed from a mobile device or not.
 * @copyright 2010 Covac Software
 * @author Christian Sciberras
 * @version 01/05/2010
 */
class Mobile 
    public static function is_mobile()
        $user_agent = $_SERVER['HTTP_USER_AGENT']; // get the user agent value - this should be cleaned to ensure no nefarious input gets executed
        $accept     = $_SERVER['HTTP_ACCEPT']; // get the content accept value - this should be cleaned to ensure no nefarious input gets executed
        return false
            || (preg_match('/ipad/i',$user_agent))
            || (preg_match('/ipod/i',$user_agent)||preg_match('/iphone/i',$user_agent))
            || (preg_match('/android/i',$user_agent))
            || (preg_match('/opera mini/i',$user_agent))
            || (preg_match('/blackberry/i',$user_agent))
            || (preg_match('/(pre\/|palm os|palm|hiptop|avantgo|plucker|xiino|blazer|elaine)/i',$user_agent))
            || (preg_match('/(iris|3g_t|windows ce|opera mobi|windows ce; smartphone;|windows ce; iemobile)/i',$user_agent))
            || (preg_match('/(mini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|m881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|s800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|d736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |sonyericsson|samsung|240x|x320|vx10|nokia|sony cmd|motorola|up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|pocket|kindle|mobile|psp|treo)/i',$user_agent))
            || ((strpos($accept,'text/vnd.wap.wml')>0)||(strpos($accept,'application/vnd.wap.xhtml+xml')>0))
            || (isset($_SERVER['HTTP_X_WAP_PROFILE'])||isset($_SERVER['HTTP_PROFILE']))
            || (in_array(strtolower(substr($user_agent,0,4)),array('1207'=>'1207','3gso'=>'3gso','4thp'=>'4thp','501i'=>'501i','502i'=>'502i','503i'=>'503i','504i'=>'504i','505i'=>'505i','506i'=>'506i','6310'=>'6310','6590'=>'6590','770s'=>'770s','802s'=>'802s','a wa'=>'a wa','acer'=>'acer','acs-'=>'acs-','airn'=>'airn','alav'=>'alav','asus'=>'asus','attw'=>'attw','au-m'=>'au-m','aur '=>'aur ','aus '=>'aus ','abac'=>'abac','acoo'=>'acoo','aiko'=>'aiko','alco'=>'alco','alca'=>'alca','amoi'=>'amoi','anex'=>'anex','anny'=>'anny','anyw'=>'anyw','aptu'=>'aptu','arch'=>'arch','argo'=>'argo','bell'=>'bell','bird'=>'bird','bw-n'=>'bw-n','bw-u'=>'bw-u','beck'=>'beck','benq'=>'benq','bilb'=>'bilb','blac'=>'blac','c55/'=>'c55/','cdm-'=>'cdm-','chtm'=>'chtm','capi'=>'capi','cond'=>'cond','craw'=>'craw','dall'=>'dall','dbte'=>'dbte','dc-s'=>'dc-s','dica'=>'dica','ds-d'=>'ds-d','ds12'=>'ds12','dait'=>'dait','devi'=>'devi','dmob'=>'dmob','doco'=>'doco','dopo'=>'dopo','el49'=>'el49','erk0'=>'erk0','esl8'=>'esl8','ez40'=>'ez40','ez60'=>'ez60','ez70'=>'ez70','ezos'=>'ezos','ezze'=>'ezze','elai'=>'elai','emul'=>'emul','eric'=>'eric','ezwa'=>'ezwa','fake'=>'fake','fly-'=>'fly-','fly_'=>'fly_','g-mo'=>'g-mo','g1 u'=>'g1 u','g560'=>'g560','gf-5'=>'gf-5','grun'=>'grun','gene'=>'gene','go.w'=>'go.w','good'=>'good','grad'=>'grad','hcit'=>'hcit','hd-m'=>'hd-m','hd-p'=>'hd-p','hd-t'=>'hd-t','hei-'=>'hei-','hp i'=>'hp i','hpip'=>'hpip','hs-c'=>'hs-c','htc '=>'htc ','htc-'=>'htc-','htca'=>'htca','htcg'=>'htcg','htcp'=>'htcp','htcs'=>'htcs','htct'=>'htct','htc_'=>'htc_','haie'=>'haie','hita'=>'hita','huaw'=>'huaw','hutc'=>'hutc','i-20'=>'i-20','i-go'=>'i-go','i-ma'=>'i-ma','i230'=>'i230','iac'=>'iac','iac-'=>'iac-','iac/'=>'iac/','ig01'=>'ig01','im1k'=>'im1k','inno'=>'inno','iris'=>'iris','jata'=>'jata','java'=>'java','kddi'=>'kddi','kgt'=>'kgt','kgt/'=>'kgt/','kpt '=>'kpt ','kwc-'=>'kwc-','klon'=>'klon','lexi'=>'lexi','lg g'=>'lg g','lg-a'=>'lg-a','lg-b'=>'lg-b','lg-c'=>'lg-c','lg-d'=>'lg-d','lg-f'=>'lg-f','lg-g'=>'lg-g','lg-k'=>'lg-k','lg-l'=>'lg-l','lg-m'=>'lg-m','lg-o'=>'lg-o','lg-p'=>'lg-p','lg-s'=>'lg-s','lg-t'=>'lg-t','lg-u'=>'lg-u','lg-w'=>'lg-w','lg/k'=>'lg/k','lg/l'=>'lg/l','lg/u'=>'lg/u','lg50'=>'lg50','lg54'=>'lg54','lge-'=>'lge-','lge/'=>'lge/','lynx'=>'lynx','leno'=>'leno','m1-w'=>'m1-w','m3ga'=>'m3ga','m50/'=>'m50/','maui'=>'maui','mc01'=>'mc01','mc21'=>'mc21','mcca'=>'mcca','medi'=>'medi','meri'=>'meri','mio8'=>'mio8','mioa'=>'mioa','mo01'=>'mo01','mo02'=>'mo02','mode'=>'mode','modo'=>'modo','mot '=>'mot ','mot-'=>'mot-','mt50'=>'mt50','mtp1'=>'mtp1','mtv '=>'mtv ','mate'=>'mate','maxo'=>'maxo','merc'=>'merc','mits'=>'mits','mobi'=>'mobi','motv'=>'motv','mozz'=>'mozz','n100'=>'n100','n101'=>'n101','n102'=>'n102','n202'=>'n202','n203'=>'n203','n300'=>'n300','n302'=>'n302','n500'=>'n500','n502'=>'n502','n505'=>'n505','n700'=>'n700','n701'=>'n701','n710'=>'n710','nec-'=>'nec-','nem-'=>'nem-','newg'=>'newg','neon'=>'neon','netf'=>'netf','noki'=>'noki','nzph'=>'nzph','o2 x'=>'o2 x','o2-x'=>'o2-x','opwv'=>'opwv','owg1'=>'owg1','opti'=>'opti','oran'=>'oran','p800'=>'p800','pand'=>'pand','pg-1'=>'pg-1','pg-2'=>'pg-2','pg-3'=>'pg-3','pg-6'=>'pg-6','pg-8'=>'pg-8','pg-c'=>'pg-c','pg13'=>'pg13','phil'=>'phil','pn-2'=>'pn-2','pt-g'=>'pt-g','palm'=>'palm','pana'=>'pana','pire'=>'pire','pock'=>'pock','pose'=>'pose','psio'=>'psio','qa-a'=>'qa-a','qc-2'=>'qc-2','qc-3'=>'qc-3','qc-5'=>'qc-5','qc-7'=>'qc-7','qc07'=>'qc07','qc12'=>'qc12','qc21'=>'qc21','qc32'=>'qc32','qc60'=>'qc60','qci-'=>'qci-','qwap'=>'qwap','qtek'=>'qtek','r380'=>'r380','r600'=>'r600','raks'=>'raks','rim9'=>'rim9','rove'=>'rove','s55/'=>'s55/','sage'=>'sage','sams'=>'sams','sc01'=>'sc01','sch-'=>'sch-','scp-'=>'scp-','sdk/'=>'sdk/','se47'=>'se47','sec-'=>'sec-','sec0'=>'sec0','sec1'=>'sec1','semc'=>'semc','sgh-'=>'sgh-','shar'=>'shar','sie-'=>'sie-','sk-0'=>'sk-0','sl45'=>'sl45','slid'=>'slid','smb3'=>'smb3','smt5'=>'smt5','sp01'=>'sp01','sph-'=>'sph-','spv '=>'spv ','spv-'=>'spv-','sy01'=>'sy01','samm'=>'samm','sany'=>'sany','sava'=>'sava','scoo'=>'scoo','send'=>'send','siem'=>'siem','smar'=>'smar','smit'=>'smit','soft'=>'soft','sony'=>'sony','t-mo'=>'t-mo','t218'=>'t218','t250'=>'t250','t600'=>'t600','t610'=>'t610','t618'=>'t618','tcl-'=>'tcl-','tdg-'=>'tdg-','telm'=>'telm','tim-'=>'tim-','ts70'=>'ts70','tsm-'=>'tsm-','tsm3'=>'tsm3','tsm5'=>'tsm5','tx-9'=>'tx-9','tagt'=>'tagt','talk'=>'talk','teli'=>'teli','topl'=>'topl','hiba'=>'hiba','up.b'=>'up.b','upg1'=>'upg1','utst'=>'utst','v400'=>'v400','v750'=>'v750','veri'=>'veri','vk-v'=>'vk-v','vk40'=>'vk40','vk50'=>'vk50','vk52'=>'vk52','vk53'=>'vk53','vm40'=>'vm40','vx98'=>'vx98','virg'=>'virg','vite'=>'vite','voda'=>'voda','vulc'=>'vulc','w3c '=>'w3c ','w3c-'=>'w3c-','wapj'=>'wapj','wapp'=>'wapp','wapu'=>'wapu','wapm'=>'wapm','wig '=>'wig ','wapi'=>'wapi','wapr'=>'wapr','wapv'=>'wapv','wapy'=>'wapy','wapa'=>'wapa','waps'=>'waps','wapt'=>'wapt','winc'=>'winc','winw'=>'winw','wonu'=>'wonu','x700'=>'x700','xda2'=>'xda2','xdag'=>'xdag','yas-'=>'yas-','your'=>'your','zte-'=>'zte-','zeto'=>'zeto','acs-'=>'acs-','alav'=>'alav','alca'=>'alca','amoi'=>'amoi','aste'=>'aste','audi'=>'audi','avan'=>'avan','benq'=>'benq','bird'=>'bird','blac'=>'blac','blaz'=>'blaz','brew'=>'brew','brvw'=>'brvw','bumb'=>'bumb','ccwa'=>'ccwa','cell'=>'cell','cldc'=>'cldc','cmd-'=>'cmd-','dang'=>'dang','doco'=>'doco','eml2'=>'eml2','eric'=>'eric','fetc'=>'fetc','hipt'=>'hipt','http'=>'http','ibro'=>'ibro','idea'=>'idea','ikom'=>'ikom','inno'=>'inno','ipaq'=>'ipaq','jbro'=>'jbro','jemu'=>'jemu','java'=>'java','jigs'=>'jigs','kddi'=>'kddi','keji'=>'keji','kyoc'=>'kyoc','kyok'=>'kyok','leno'=>'leno','lg-c'=>'lg-c','lg-d'=>'lg-d','lg-g'=>'lg-g','lge-'=>'lge-','libw'=>'libw','m-cr'=>'m-cr','maui'=>'maui','maxo'=>'maxo','midp'=>'midp','mits'=>'mits','mmef'=>'mmef','mobi'=>'mobi','mot-'=>'mot-','moto'=>'moto','mwbp'=>'mwbp','mywa'=>'mywa','nec-'=>'nec-','newt'=>'newt','nok6'=>'nok6','noki'=>'noki','o2im'=>'o2im','opwv'=>'opwv','palm'=>'palm','pana'=>'pana','pant'=>'pant','pdxg'=>'pdxg','phil'=>'phil','play'=>'play','pluc'=>'pluc','port'=>'port','prox'=>'prox','qtek'=>'qtek','qwap'=>'qwap','rozo'=>'rozo','sage'=>'sage','sama'=>'sama','sams'=>'sams','sany'=>'sany','sch-'=>'sch-','sec-'=>'sec-','send'=>'send','seri'=>'seri','sgh-'=>'sgh-','shar'=>'shar','sie-'=>'sie-','siem'=>'siem','smal'=>'smal','smar'=>'smar','sony'=>'sony','sph-'=>'sph-','symb'=>'symb','t-mo'=>'t-mo','teli'=>'teli','tim-'=>'tim-','tosh'=>'tosh','treo'=>'treo','tsm-'=>'tsm-','upg1'=>'upg1','upsi'=>'upsi','vk-v'=>'vk-v','voda'=>'voda','vx52'=>'vx52','vx53'=>'vx53','vx60'=>'vx60','vx61'=>'vx61','vx70'=>'vx70','vx80'=>'vx80','vx81'=>'vx81','vx83'=>'vx83','vx85'=>'vx85','wap-'=>'wap-','wapa'=>'wapa','wapi'=>'wapi','wapp'=>'wapp','wapr'=>'wapr','webc'=>'webc','whit'=>'whit','winw'=>'winw','wmlb'=>'wmlb','xda-'=>'xda-',)))
        ;
    

【讨论】:

你能提供这个来源的链接吗? @Phill Pafford - 不幸的是,K2F 尚未公开。【参考方案7】:

http://www.hand-interactive.com/resources/detect-mobile-javascript.htm

var deviceBB = "blackberry";

//Initialize our user agent string to lower case. 
var uagent = navigator.userAgent.toLowerCase();

//************************** // Detects if the current browser is a BlackBerry of some sort. 

function DetectBlackBerry()     
if (uagent.search(deviceBB) > -1)
      return true;    else
      return false; 

【讨论】:

【参考方案8】:

我已经发布了“Apache Mobile Filter”的最后一个版本,这个开源项目在前 8 个月内,从 sourceforge 下载了超过 1100 次,我想从 CPAN 下载也是如此。

Apache 移动过滤器允许您从任何编程语言访问 WURFL,而不仅仅是传统上用于动态移动网站的 Java 和 php。

模块检测移动设备并将 WURFL 功能作为环境变量传递给其他 Web 应用程序。它还可用于动态调整图像大小以适应移动设备的屏幕尺寸。

试试看,告诉我你的意见。

欲了解更多信息:http://www.idelfuschini.it/it/apache-mobile-filter-v2x.html

【讨论】:

【参考方案9】:

我不建议使用 Javascript 来检测移动设备,原因很简单,因为其中许多设备不支持 Javascript,因此无法保证您的检测代码适用于所有设备。

通常检测是使用像WURFL 这样的描述符文件在服务器端完成的,它不仅可以帮助您检测各种移动用户代理,还可以检测它们的功能、屏幕尺寸、颜色深度等。这样您就可以根据移动设备提供不同的资产配置(javascript 文件、图像大小等)。

【讨论】:

同意。我在禁用 JS 的情况下在我的黑莓上浏览,我怀疑我是一个人。 -1 可能全世界都在手机上禁用了 JS,但 OP 从来没有问过。 他也没有问如何让他的头着火,但我也不建议这样做。浏览器嗅探作为编写跨浏览器代码的通用检测手段对于常规浏览器来说是一个糟糕的想法,但对于移动设备来说却是一个非常可怕的想法。 -1,禁用 JavaScript? 2 年前:是的。现在:没有。 @Derek 他两年多前写的,事后投反对票有点不公平;)

以上是关于移动检测[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Facebook Messenger 检测关闭 web 视图(移动)

对于opera mini,使用javascript检测移动视图是打开还是关闭

在没有用户代理嗅探的情况下检测移动浏览器[关闭]

在没有用户代理嗅探的情况下检测移动浏览器[关闭]

移动端检测微信浏览器返回,关闭,进入后台操作

移动端检测微信浏览器返回,关闭,进入后台操作