如何确定它是否是使用PHP的移动设备?
我正在用PHP编写一个网站。由于网络上的任何人都需要访问以访问互联网,我必须创建一个移动版本。如何最好地检查它是否是移动设备?由于我不仅想支持iPhone,所以我不想在最后使用50个设备进行切换声明。如何确定它是否是使用PHP的移动设备?
有没有我可以使用的PHP类?
要基于User-Agent进行检测,请使用WURFL database。至少它是全面的,并不断更新。
如果您只定位高端(ish)手机,则根本不需要检测它们,只需要embed appropriate mobile stylesheets即可。
要考虑的另一件事:很多网站实际上会为移动设备提供不同的网址。以http://m.facebook.com为例。随着设备的日益增长的能力,这给了你的用户一个选择。如果他们使用的是可以实际处理完整网站的设备(使用缩放和其他功能),那么他们可能会被强制进入特定的布局。
如果您想让内容适应任何特定设备,例如要将图像大小调整为设备的宽度,则还可以使用DeviceAtlas。 根据请求设备的使用情况,它会告诉您屏幕的大小,以及支持的图像格式,支持的标记类型,最大页面大小等。
大多数移动网站都使用user_agent。设备功能的开源数据库维护在http://wurfl.sourceforge.net/ 使用wurlf,并基于user_agent,您可以识别屏幕物理和像素宽度,长度以及更多参数,并进行渲染决策。
什么是移动设备?较弱的CPU?带宽更低?实际上,它的屏幕分辨率低于320x240,色深低于24.
您必须使用Javascript。此链接会给你一个想法: http://www.w3schools.com/js/tryit.asp?filename=tryjs_browsermonitor
而且,这个环节将教你什么是什么:已通过HTTP User-Agent头反对以及列表进行比较检测 http://www.w3schools.com/htmldom/dom_obj_screen.asp
传统移动设备已知的移动UA字符串。一种新颖的方法试图检测桌面操作系统的存在 - 任何发现不是桌面操作系统的东西都必须是移动的。
这会导致误报少得多。
我已经写在Python示例代码在这里一个帖子: http://notnotmobile.appspot.com
这里是一个片段:
import re
# Some mobile browsers which look like desktop browsers.
RE_MOBILE = {
"iphone" : re.compile("ip(hone|od)", re.I),
"winmo" : re.compile("windows\s+ce", re.I)}
RE_DESKTOP = {
"linux" : re.compile(r"linux", re.I),
"windows" : re.compile(r"windows", re.I),
"mac" : re.compile(r"os\s+(X|9)", re.I),
"solaris" : re.compile(r"solaris", re.I),
"bsd" : re.compile(r"bsd", re.I)}
# Bots that don't contain desktop OSs.
RE_BOT = re.compile(r"(spider|crawl|slurp|bot)")
def is_desktop(user_agent):
# Anything that looks like a phone isn't a desktop.
for regex in RE_PHONE.values():
if regex.search(user_agent) is not None:
return False
# Anything that looks like a desktop probably is.
for regex in RE_DESKTOP.values():
if regex.search(user_agent) is not None:
return True
# Bots get the desktop view.
if RE_BOT.search(user_agent) is not None:
return True
# Anything else is probably a phone!
return False
def get_user_agent(request):
# Some browsers put the User-Agent in a HTTP-X header
if 'HTTP_X_OPERAMINI_PHONE_UA' in request.headers:
return request.headers['HTTP_X_OPERAMINI_PHONE_UA']
elif:
# Skyfire/Bolt/other mobile browsers
...
else:
return request.headers.get('HTTP_USER_AGENT', '')
def view(request):
user_agent = get_user_agent(request)
if is_desktop(user_agent):
return desktop_response()
else:
return mobile_response()
你应该看看Tera-WURFL,它是一个PHP &基于MySQL的软件包可以检测移动设备及其功能。这里是你会用它来检测是否来访的设备是移动的万亿WURFL代码:
<?php
require_once("TeraWurfl.php");
$wurflObj = new TeraWurfl();
$wurflObj->GetDeviceCapabilitiesFromAgent();
if($wurflObj->capabilities['product_info']['is_wireless_device']){
// this is a mobile device
}else{
// this is a desktop device
}
?>
对于重定向的部分,我用
$arr = explode('.', $_SERVER['SERVER_NAME'], 2);
$sub=$arr[0];
$need_redirect=false;
if (!isset($_SERVER['HTTP_REFERER'])){
$need_redirect=true;
}else{
$domain = parse_url($_SERVER['HTTP_REFERER']);
$host = $domain['host'];
if (!preg_match('/romajidesu\.com/', $host)){
$need_redirect=true;
}
}
if ($need_redirect && ($sub!='m') && is_mobile()){
$old_url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$new_url='http://'.str_replace('www.', 'm.', $old_url);
header("Location:".$new_url);die();
}
对于我implmentation的更多细节,请阅读我的博客为http://haibuihoang.blogspot.com/2012/11/how-to-redirect-mobile-users-to-your.html
这不是通过检查用户代理来决定移动设备的最佳选择。你应该加入javascript设备宽度检查和PHP用户代理检查。但是直到某点用户代理检查是可以接受的。
我用这个。不如WURFL,但很容易解决我的问题:
function is_mobile_device() {
$agent=$_SERVER['HTTP_USER_AGENT'];
if(strpos($agent,"Android") !== FALSE
|| strpos($agent,"IOS") !== FALSE
|| strpos($agent,"iPhone") !== FALSE
|| strpos($agent,"iPad") !== FALSE
|| strpos($agent,"iPod") !== FALSE
|| strpos($agent,"Symbian") !== FALSE
|| strpos($agent,"BlackBerry") !== FALSE
|| strpos($agent,"Opera Mini") !== FALSE
) {
return TRUE;
}
return FALSE;
}
如果他们正在使用他们自己的检测,那么它已经坏了。它告诉我,我在Mac OS X上的Opera 10是一款手机浏览器。 – Kornel 2008-12-22 12:16:48
我没有调试他们的脚本,如果这就是你问的:) 当然,你应该总是测试你在互联网上阅读的所有内容,但原理是 – 2008-12-22 12:41:23
这篇文章是四岁,错过了很多较新的设备。 – bestattendance 2011-10-16 21:43:22