【问题标题】:Distinguish Android Chrome from stock browser. Stock browser's user agent contains 'Chrome'将 Android Chrome 与普通浏览器区分开来。股票浏览器的用户代理包含“Chrome”
【发布时间】:2014-09-15 13:35:35
【问题描述】:

我需要告诉用户为我的网站使用的浏览器。 (编辑:用户需要添加书签,这在标准的“互联网”浏览器上是不可能的。我需要知道向他们显示什么消息。)

编辑:我不需要能够检测任何类型的浏览器。具体来说,在这种情况下,我需要能够检测浏览器是否真的是 Google Chrome 浏览器

对于至少一种智能设备,我无法区分普通的“互联网”浏览器和 Chrome;两者都包含“Chrome”一词。

三星 Galaxy S5:

股票浏览器用户代理:

Mozilla/5.0(Linux;Android 4.4.2;en-us;SAMSUNG-SM-G900A Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.6 Chrome/28.0.1500.94 Mobile Safari/537.36

Chrome 用户代理:

Mozilla/5.0(Linux;Android 4.4.2;SAMSUNG-SM-G900A Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.128 Mobile Safari/537.36

“Version/X.x”不同,但总是这样吗?

编辑:我确实已经按照 cmets 中的建议检查了以前的答案。他们假设非 Chrome 浏览器不包含 Chrome 一词。

【问题讨论】:

  • 尝试检测特定类型的浏览器通常是个坏主意。检测对您的代码真正重要的事物(例如某些功能的存在或缺乏(称为功能检测))并根据存在的功能而不是您认为的浏览器来确定您的逻辑要好得多。
  • 那么这两种浏览器有什么不同的功能呢?我需要知道用户是否可以安装书签,但这不是我可以检查的。
  • @trainoasis 在我问自己之前,我会检查以前的答案。你提到的那些没有回答这个问题。 (有时人们会很快将一个问题标记为重复而不进行实际检查。这会损害新问题被回答的机会。)
  • @jfriend00 IRL,其中许多 JS“功能”在移动浏览器上默默地失败了。 ibm.com/developerworks/library/wa-ioshtml5

标签: javascript android user-agent


【解决方案1】:

我会推荐这样的东西:

function testForAndroidChrome() {
    var version = navigator.appVersion;
    if (version.indexOf('(KHTML, like Gecko) Chrome' != -1) {
        return true; // it's Chrome
    } else {
        return false; // it's the stock browser
    }
}

var myTest = testForAndroidChrome(); // returns true or false

【讨论】:

    【解决方案2】:

    您可以使用 JavaScript,例如

    var chromeVersion = /^Google/.test(navigator.vendor) && !/ OPR/.test(navigator.userAgent) && /Chrome\/([0-9]+|$)/.exec(navigator.userAgent)[1];
    var isChromeWebview = chromeVersion >= 30 && !('chrome' in window);
    

    window.chrome 在 Chrome 浏览器中定义(至少从 Chrome 10 开始),但未在 Chrome WebView 中定义(Chrome 最初用于 Android 4.4.x 上的 WebView;AOSP 用于 Android 4.3 的 WebView或更少)。

    我个人不会在生产中使用该测试(它对于不同的浏览器和版本不可靠),但如果您将它用于不重要的目的,它会满足您的需求。

    【讨论】:

      【解决方案3】:

      看了很多东西,好像都做的不大,看不出来还是有问题的。网上搜了,没解决。

      我自己去查了一下,发现了这个:

      所以我发现本机浏览器(在三星 S4 上)确实在“Gecko”之后附加了 SamsungBrowser。

      在 Chrome 上,它“像 Gecko) Chrome”。

      所以紧跟在“Gecko)”之后,就是“Chrome”。

      也许这可以解决问题,因为三星将它自己的字符串附加到用户代理中。

      是否有可能其他设备再次引起问题?

      【讨论】:

        【解决方案4】:

        请查看此链接:https://developer.chrome.com/multidevice/user-agent 在最后一段中,我们发现:

        如果您试图区分 WebView 和 Chrome 对于 Android,您应该寻找 Version/X.X WebView 用户代理字符串中的字符串。

        【讨论】:

          【解决方案5】:

          所以区别在于用户代理:

          版本/X.X

          来自https://developer.chrome.com/multidevice/user-agent#webview_user_agent

          “如果您试图区分 WebView 和 Chrome for Android,您应该在 WebView 用户代理字符串中查找 Version/XX 字符串。”

          我想 Chrome webview 浏览器仍然可以选择忽略这一点,但如果它确实有,那么至少我知道它不是真正的 Google Chrome!

          【讨论】:

          • 我在几部手机上测试了它,它工作正常!谢谢!
          • 我不相信Version/_X.X_ 启发式是准确的。我正在使用最新的股票浏览器测试 HTC One SV,它在 UA 中没有 Version/_X.X_mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
          • 我不确定您是否了解 WebView 是什么,但它肯定不是 Android Stock 浏览器。没有办法安全地检测到它。充其量通过多次检查,您将获得 60-80% 的命中率。
          【解决方案6】:

          (我不能评论,所以我写了一个答案。)

          User984003 因此,如果我理解正确(根据您的评论),您基本上需要一个测试来区分移动设备上的库存浏览器和用户安装的浏览器。您想要这个是因为它们之间在安装书签的权限方面存在差异,对吧?

          然后在这个线程中讨论这个主题:How to detect the stock Android browser(这个线程中简短且不令人满意的答案是:“没有可靠且通用的方法来检测仅股票浏览器。”)

          这里还有一些关于在 android 上安装书签的方法的信息:http://smallbusiness.chron.com/making-bookmarklets-work-android-50685.html(也许这里有一些你不知道的替代方案,这使得区分浏览器版本的尝试过时了。)

          【讨论】:

          • 虽然你说这不是一个答案,但我相信它是一个,因为它确实回答了这个问题:“(该线程中简短且不令人满意的答案是:“没有可靠和通用的方法只检测股票浏览器。”)"
          • 我需要的不是能够检测任何类型的浏览器:我需要的是能够在我看到 Chrome 中的单词时检测某物是否是“真正的”Chrome 浏览器用户代理。
          【解决方案7】:

          由于我不知道股票浏览器和 chrome 之间有任何明显的功能差异,因此使用用户代理字符串播放“发现差异”表明股票浏览器中所述的 Chrome 版本是相当多的版本。

          虽然这不是最好的区别,而且股票浏览器总是可以更新,至少目前,这对你来说可能没问题。

          ...你还没有真正说过你将如何使用它。

          【讨论】:

          • 用户需要添加书签,这在标准的“互联网浏览器”上是不可能的。所以我需要知道要写什么信息。 @Dylan Watson:这张幻灯片很有趣(也很悲伤)。
          • 你还没有尝试在网页中播放音频,那么:)
          猜你喜欢
          • 1970-01-01
          • 2015-05-07
          • 1970-01-01
          • 2015-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-17
          • 1970-01-01
          相关资源
          最近更新 更多