1

我有一个带有完整浏览器和 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....
}

在这里,我更喜欢速度而不是准确性,所以我不是在寻找更慢的、最新的查找服务,如这里建议的:简单的智能手机检测

只是快速表明访问者拥有支持 cookie 和 JQM 的当前顶级智能手机/平板电脑浏览器之一。

有人可以建议对我的 $SMARTPHONE_WITH_COOKIES 进行改进吗?或者将我指向适合我用例的 UA 签名集合?具体来说,将黑莓列入名单是否安全?我是否忽略了流行的功能浏览器?

4

4 回答 4

2

有关检测浏览器是否支持 JQM 的方法和检查cookie的方法,请参阅THISTHIS问题。

两个答案都来自stackoverflow :)

于 2012-08-13T18:53:29.360 回答
2

尽管以下列表中并非所有移动浏览器都支持 cookie,但拥有移动设备的 UA 字符串列表可能很有用(此列表来自Django App mini 检测器): http: //minidetector.googlecode.com/svn/trunk/minidetector /search_strings.txt

需要注意的是,此列表不包括诺基亚平板电脑 - 请在此处查看原因

于 2012-08-13T19:00:32.527 回答
1

就个人而言,我不想依赖维护一系列用户代理。新设备不断涌现,就像没人管我的事,我什至更改了用户代理名称并搞砸了我的检测过程(Kindle Fire 的 Silk 浏览器)。

另一种方法是测试设备功能。WURFL数据库是一个很好的起点。尽管最近发生了一些禁止衍生作品的许可更改,但它们仍然有一个公共存储库,您可以在您的站点上下载和使用。

以下是一些可用于测试 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');
于 2012-08-20T17:51:33.677 回答
1

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

对于它的价值,我考虑了以下几点:

  • Opera Mini 对我的 JQM 应用程序的 JavaScript 支持不够好。
  • 在 Android 上运行的 Opera Mobile 是我很想抓住的一个主要类别,但我没有足够的信心来正确地从 UA 字符串中挑选出所有这些。
  • 我考虑过“windows phone os 7”,但认为它过时太快了
  • 符合条件的黑莓浏览器子集也很难简单检测,因此我决定放弃整个层,而不是冒着误报的风险。

所以,我剩下的是:

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

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

于 2012-08-21T06:50:08.303 回答