2012-08-10 110 views
1

我有一個完整的瀏覽器和jQuery Mobile界面的網站,用戶可以在兩者之間切換。他們的偏好存儲在一個cookie中。默認情況下,該網站向訪問者提供完整版本,而不是爲偏好設置cookie,但爲了使現代智能手機用戶更好,我希望他們的默認設置爲JQM。所以,我在我的控制器基類的構造函數的代碼:檢測支持cookie和jQuery Mobile的智能手機/平板電腦瀏覽器

class BaseController 
{ 

    protected $mobile; // must be 0 or 1, cookies can't handle boolean 'false' 

    public function __construct() 
    { 
     if (isset($_COOKIE['mobile'])) 
     { 
      $this->mobile = $_COOKIE['mobile']; 
     } 
     else 
     { 
      $this->mobile = $this->isSmartphoneWithCookies(); 
      setcookie("mobile", $this->mobile, time() + 7776000, '/', ''); // 90 days 
     } 
    } 

    private function isSmartphoneWithCookies() 
    { 
     $SMARTPHONE_WITH_COOKIES = "android.+mobile|blackberry|ip(hone|od)|opera m(ob|in)i"; 

     return preg_match("/$SMARTPHONE_WITH_COOKIES/i", $_SERVER['HTTP_USER_AGENT']) ? 1 : 0; 
    } 

    // the rest of my controller class.... 
} 

在這裏,我喜歡速度,準確性,所以我不是在尋找一個更慢,跟上時代的查詢服務,如下建議:Simple Smart Phone detection

只是一個快速提示,訪問者擁有當前支持cookies和JQM的頂級智能手機/平板電腦瀏覽器之一。

有人可以建議改善我的$ SMARTPHONE_WITH_COOKIES嗎?或者將我指向符合我的用例的UA簽名集合?具體來說,黑莓手機在名單上安全嗎?我忽略了一個流行的瀏覽器嗎?

回答

1

通過設計,爲我的應用程序主UI選擇是用戶。我不想將它委託給檢測腳本。有問題的檢測點只是爲了給出一個聰明的默認值。這是一個危險的功能,因爲誤報(例如沒有cookie支持的智能手機)會使我的網站完全無法訪問某些用戶。所以如果失敗了,它就需要朝標準接口方向發展。

對於它的價值,我認爲以下幾點:

  • 的Opera Mini沒有爲我的JQM 應用足夠好JavaScript的支持。
  • 在Android上運行的Opera Mobile是一個主要的類別,我想 曾愛過,但我沒有足夠的信心,我可以 正確選擇所有的UA字符串。
  • 我認爲「的Windows Phone OS 7」,但決定將日期太快
  • 的有資格也太棘手的檢測 只是黑莓瀏覽器的子集,因此而不是風險誤報,我決定放棄整個層次爲 。

所以,我離開了我用的是:

$SMARTPHONE_WITH_COOKIES = "android.+mobile|iphone|ipod"; 

保持它的這盞燈,簡單的成本是,我將不得不重新考慮這個問題,每隔兩年左右。我還會有許多移動訪問者需要額外點擊才能獲得移動版本。

2

請參閱THISTHIS關於檢測瀏覽器是否支持JQM的方法的問題,以及用於檢查cookie的THIS

兩個問題的答案都是從計算器:)

+0

良好的信息:MobileESP項目中的DetectTierIphone()函數可能證明是可行的。關於客戶端JQM檢測的鏈接是無用的,不是這樣,我不希望在沒有cookie的情況下每次請求進入時都會重定向頁面。當然,有人必須知道這四類瀏覽器是否支持cookies。 – 2012-08-13 19:53:02

1

就個人而言,我不希望依賴於維護用戶代理字符串。新設備像沒有任何業務一樣出現,我甚至對我進行了用戶代理名稱更改,並搞砸了我的檢測過程(Kindle Fire的Silk瀏覽器)。

另一種方法是測試設備功能。 WURFL數據庫是一個很好的起點。儘管最近有一些licensing changes禁止衍生作品,但他們仍然有一個公共存儲庫,您可以在您的網站上下載並使用它。

下面是一些功能,將用於測試A-級裝置是有用的:

$requestingDevice = $wurflManager->getDeviceForHttpRequest($_SERVER); 

$is_wireless = ($requestingDevice->getCapability('is_wireless_device') == 'true'); 
$is_tablet = ($requestingDevice->getCapability('is_tablet') == 'true'); 
$is_mobile_device = ($iswireless || $istablet); 
$supports_cookies = ($requestingDevice->getCapability('cookie_support') == 'true'); 
$supports_web = ($requestingDevice->getCapability('device_claims_web_support') == 'true'); 
$supports_javascript = ($requestingDevice->getCapability('ajax_support_javascript') == 'true'); 
$supports_ajax = ($requestingDevice->getCapability('ajax_xhr_type') != 'none'); 
$supports_css3 = ($requestingDevice->getCapability('css_rounded_corners') == 'css3'); 
+0

謝謝你的建議,Derek。我以前曾考慮過WURFL,但認爲這對我的使用案例來說太過分了。 +1分享您不斷變化的UA字符串的體驗。我從來沒有意識到這是可能的! – 2012-08-21 06:23:13

相關問題