2008-12-22 68 views
13

我正在用PHP編寫一個網站。由於網絡上的任何人都需要訪問以訪問互聯網,我必須創建一個移動版本。如何最好地檢查它是否是移動設備?由於我不僅想支持iPhone,所以我不想在最後使用50個設備進行切換聲明。如何確定它是否是使用PHP的移動設備?

有沒有我可以使用的PHP類?

回答

15

您需要檢查客戶端發送的幾個標頭,例如USER_AGENT和HTTP_ACCEPT。查看this article,獲取PHP中移動用戶代理的全面檢測腳本。

+0

如果他們正在使用他們自己的檢測,那麼它已經壞了。它告訴我,我在Mac OS X上的Opera 10是一款手機瀏覽器。 – Kornel 2008-12-22 12:16:48

+0

我沒有調試他們的腳本,如果這就是你問的:) 當然,你應該總是測試你在互聯網上閱讀的所有內容,但原理是 – 2008-12-22 12:41:23

+1

這篇文章是四歲,錯過了很多較新的設備。 – bestattendance 2011-10-16 21:43:22

4

要考慮的另一件事:很多網站實際上會爲移動設備提供不同的網址。以http://m.facebook.com爲例。隨着設備的日益增長的能力,這給了你的用戶一個選擇。如果他們使用的是可以實際處理完整網站的設備(使用縮放和其他功能),那麼他們可能會被強制進入特定的佈局。

0

如果您想讓內容適應任何特定設備,例如要將圖像大小調整爲設備的寬度,則還可以使用DeviceAtlas。 根據請求設備的使用情況,它會告訴您屏幕的大小,以及支持的圖像格式,支持的標記類型,最大頁面大小等。

0

大多數移動網站都使用user_agent。設備功能的開源數據庫維護在http://wurfl.sourceforge.net/ 使用wurlf,並基於user_agent,您可以識別屏幕物理和像素寬度,長度以及更多參數,並進行渲染決策。

2

傳統移動設備已知的移動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

你應該看看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 
} 
?>  
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(); 
} 

對於我implmentation的更多細節,請閱讀我的博客爲http://haibuihoang.blogspot.com/2012/11/how-to-redirect-mobile-users-to-your.html

0

這不是通過檢查用戶代理來決定移動設備的最佳選擇。你應該加入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; 

} 
相關問題