检测支持cookie和jQuery Mobile的智能手机/平板电脑浏览器

时间:2012-08-10 14:04:07

标签: php cookies jquery-mobile browser-detection

我有一个带有完整浏览器和jQuery Mobile界面的网站,用户可以在两者之间切换。他们的偏好存储在cookie中。默认情况下,该网站为访问者提供完整版本,而不是偏好cookie,但为了使现代智能手机用户更好,我希望他们的默认值为JQM。所以,我在我的基本控制器类的构造函数中有这个代码:

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

快速显示访问者拥有支持Cookie和JQM的当前顶级智能手机/平板电脑浏览器之一。

有人可以建议改善我的$ SMARTPHONE_WITH_COOKIES吗?或者指向一个适合我的用例的UA签名集合?具体来说,将黑莓列入名单是否安全?我是否会忽略一个受欢迎的浏览器?

4 个答案:

答案 0 :(得分:2)

请参阅THISTHIS问题,了解检测浏览器是否支持JQM的方法,以及THIS检查Cookie的方法。

这两个答案都来自stackoverflow:)

答案 1 :(得分:2)

虽然下面列表中并非所有移动浏览器都支持Cookie,但拥有移动设备的UA字符串列表非常有用(来自Django App mini detector的此列表):http://minidetector.googlecode.com/svn/trunk/minidetector/search_strings.txt

重要提示请注意,此列表不包括诺基亚平板电脑 - 请参阅here why

答案 2 :(得分: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');

答案 3 :(得分:1)

按照设计,我的应用程序的主UI选择器是用户。我不想将其委托给检测脚本。有问题的检测只是为了给出一个聪明的默认值。这是一个风险很大的功能,因为误报(例如没有cookie支持的智能手机)可能使我的网站完全无法访问某些用户。因此,如果失败,则需要向标准接口失败。

对于它的价值,我考虑了以下内容:

  • Opera Mini对我的JQM没有足够的javascript支持 应用程序。
  • 在Android上运行的Opera Mobile是我的主要类别 我喜欢捕捉,但我不能自信 正确选择UA字符串中的所有内容。
  • 我认为“windows phone os 7”,但决定它的约会时间太快
  • 符合条件的Blackberry浏览器子集也难以检测 简单地说,所以我决定放弃 整层。

所以,我留下的是:

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

保持这种轻松和简单的代价是我必须每两年左右再次重新考虑这个问题。我还将有许多移动访问者需要额外点击才能获得移动版本。