如何确定它是否是带有PHP的移动设备?

时间:2008-12-22 11:36:35

标签: php mobile

我正在用PHP编写一个网站。由于网络上的任何人都需要访问它才能访问互联网,因此我必须创建一个移动版本。如何最好地检查它是否是移动设备?我不想在最后有50个设备的switch语句,因为我不仅要支持iPhone。

我可以使用PHP类吗?

11 个答案:

答案 0 :(得分:15)

您需要检查客户端发送的多个标头,例如USER_AGENT和HTTP_ACCEPT。查看this article以获取PHP中移动用户代理的全面检测脚本。

答案 1 :(得分:5)

你应该看看Tera-WURFL,这是一个PHP&基于MySQL的软件包,可检测移动设备及其功能。以下是您将用于检测访问设备是否可移动的Tera-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
}
?>    

答案 2 :(得分:4)

需要考虑的另一件事:许多网站实际上会为移动设备提供不同的网址。请参阅http://m.facebook.com作为示例。随着设备日益增长的能力,这为您的用户提供了一个选择。如果他们使用的设备可以很好地处理一个完整的网站(使用缩放和诸如此类的东西),那么他们可能会非常恼火地被迫进入特定的布局。

答案 3 :(得分:3)

对于重定向部分,我使用了

$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();
}

有关我的详细信息,请阅读我的博客http://haibuihoang.blogspot.com/2012/11/how-to-redirect-mobile-users-to-your.html

答案 4 :(得分:2)

传统上通过将HTTP User-Agent标头与众所周知的移动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()

答案 5 :(得分:1)

请求中的用户代理是否会为您提供足够的信息来做出决定?

有一个很好的list of user agents here

答案 6 :(得分:0)

对于基于User-Agent的检测,请使用WURFL database。至少它是全面且不断更新的。

如果您只定位高端(ish)手机,那么您可能根本不需要检测它们,只需embed appropriate mobile stylesheets

答案 7 :(得分:0)

如果您想让内容适应任何特定设备,例如要将图像大小调整为设备的宽度,您还可以使用DeviceAtlas。 根据请求设备的使用者,它将告诉您屏幕的大小,支持的图像格式,支持的标记类型,最大页面大小等。

答案 8 :(得分:0)

大多数移动网站都使用user_agent。设备功能的开源数据库维护在http://wurfl.sourceforge.net/ 使用wurlf,并基于user_agent,您可以识别屏幕物理和像素宽度,长度以及更多参数,并做出渲染决策。

答案 9 :(得分:0)

什么是移动设备? CPU较弱?带宽较低?实际上,它的分辨率低于320x240,色深低于24。

你也必须使用Javascript。这个链接会给你一个想法: http://www.w3schools.com/js/tryit.asp?filename=tryjs_browsermonitor

而且,此链接将教你什么是: http://www.w3schools.com/htmldom/dom_obj_screen.asp

答案 10 :(得分:0)

通过检查用户代理来决定移动设备不是最好的选择。您应该使用PHP用户代理检查加入javascript设备宽度检查。但是在某些时候用户代理检查是可以接受的。

我用这个。不如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;

}