区分Android Chrome和原生浏览器。原生浏览器的用户代理中包含“Chrome”。

6
我需要知道用户在我的网站上使用的浏览器。(编辑:用户需要添加一个书签工具,而这无法在标准“互联网”浏览器上实现。我需要知道该向他们显示什么消息。)
编辑: 我不需要检测任何类型的浏览器。具体而言,在这种情况下,我需要能够检测出浏览器是否真正是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
“版本/X.x”是不同的,但这将始终如此吗?
编辑:如评论中建议的那样,我已经检查了以前的答案。它们假定非Chrome浏览器不包含单词Chrome。

可能的重复问题 https://dev59.com/UGox5IYBdhLWcg3wTytx https://dev59.com/5WYq5IYBdhLWcg3wixFr - trainoasis
1
通常尝试检测特定类型的浏览器是一个不好的想法。更好的方法是检测实际对你的代码有影响的事物,比如某些功能的存在或缺失(称为特性检测),并根据存在的功能而不是你认为的浏览器来制定逻辑。 - jfriend00
1
那么这两个浏览器之间有什么不同的功能呢?我需要知道用户是否可以安装书签小工具,但这不是我可以检查的东西。 - user984003
1
@trainoasis 在我提问之前,我会检查之前的答案。你提到的那些并没有回答我的问题。(有时候人们非常迅速地将一个问题标记为重复,而实际上并没有检查。这会影响新问题得到答案的机会。) - user984003
@jfriend00,在现实生活中,许多JS的“特性”在移动浏览器上会悄无声息地失败。http://www.ibm.com/developerworks/library/wa-ioshtml5/ - yPhil
@xaccrocheur - 正确的特性检测在移动浏览器上和桌面浏览器上同样有效 - 这就是整个重点。你测试所需的特性是否存在并正常工作,而不是测试使用的浏览器。 - jfriend00
7个回答

8
因此,用户代理中的区别如下: Version/X.X 来自https://developer.chrome.com/multidevice/user-agent#webview_user_agent:
"If you’re attempting to differentiate between the WebView and Chrome for Android, you should look for the presence of the Version/X.X string in the WebView user-agent string."
我想一个Chrome webview浏览器仍然可以选择省略那个部分,但如果它有它,那么至少我知道它不是真正的Google Chrome!

我在几部手机上测试过,它可以正常工作!谢谢! - Technotronic
1
我不确定 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 - Sam Hasler
1
我不确定您是否理解了WebView是什么,但它肯定不是Android股票浏览器。没有安全地检测它的方法。最好的情况是通过多次检查,您将获得60-80%的命中率。 - Arnaud Leyder

3
请查看此链接:https://developer.chrome.com/multidevice/user-agent。 在最后一段中,我们可以找到以下内容:
如果您试图区分Android上的WebView和Chrome浏览器,则应在WebView用户代理字符串中查找Version / X.X字符串。

0
我建议您这样做:
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

0

您可以使用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)。

我个人不会在生产环境中使用该测试(对于不同的浏览器和版本,它将不可靠),但如果您将其用于非关键目的,则可以实现您想要的功能。


0

由于我不知道股票浏览器和Chrome之间有任何明显的功能差异,因此通过用户代理字符串进行“发现差异”可以发现,在股票浏览器中声明的Chrome版本相当多地落后。

虽然这不是最好的差异,股票浏览器始终可以更新,但至少目前来看,这可能对您有效。

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


用户需要添加一个书签小工具,这在标准的“互联网浏览器”上是不可能的。因此,我需要知道要写什么信息。@Dylan Watson:那张幻灯片很有趣(也很悲哀)。 - user984003
1
你还没有尝试在网页中播放音频 :) - yPhil

0
(我不能评论,所以我写了一个答案。)
User984003,如果我从你的评论中理解正确的话,你想要在移动设备上区分原生浏览器和用户安装的浏览器。你想要这样做是因为它们在安装书签脚本的权限方面有所不同,对吗?
那么这个主题在这个帖子中有讨论:如何检测原生Android浏览器(这个帖子中简短而令人不满意的答案是:“没有可靠和通用的方法来仅检测原生浏览器。”)
此外,这里还有一些关于在Android上安装书签脚本的方法的信息:http://smallbusiness.chron.com/making-bookmarklets-work-android-50685.html(也许这里有一些你不知道的替代方法,这使得区分浏览器版本的尝试变得过时。)

虽然你说这不是一个答案,但我认为它是一个答案,因为它确实回答了这个问题:“(在这个帖子中短暂而不令人满意的答案是:“没有可靠和通用的方法来仅检测股票浏览器。”)” - Léo Lam
我需要的不是能够检测任何类型的浏览器,而是当我在用户代理中看到Chrome这个词时,能够检测出是否为“真正的”Chrome浏览器。 - user984003

0

阅读了很多资料,似乎它们都没有做太多的事情,看起来仍然存在差异。我在网上搜索,但没有找到解决方案。

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

Differences between native and Chrome

我发现原生浏览器(三星S4上)在“Gecko)”后添加了“SamsungBrowser”。

在Chrome上,它是“like Gecko) Chrome”。

所以在“Gecko)”之后立即加上“Chrome”。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接