从用户代理或 Javascript 检测 64 位或 32 位 Windows?

IT技术 javascript 64-bit operating-system user-agent
2021-01-28 07:14:46

我想提供正确版本的下载。我拥有的版本是:

  • 32 位 Windows
  • 64 位 Windows
  • Linux

使用用户代理字段检测 Linux 很容易;但是是否有可能可靠地确定 Windows 是 32 位还是 64 位?

用户可能使用奇怪的浏览器——IE 和 Firefox 很常见,我们可能在某个地方有一个 Opera 用户;也许也是 Chrome 用户。我知道 64 位 Windows 7 附带 32 位和 64 位版本的 IE,我想将我下载的 64 位版本发送给他们。

(编辑补充:我知道我应该提供所有选项,我会。但人们不阅读选项。所以我想默认提供正确的下载,以提高可用性。当然,虽然这很有帮助如果我做对了,如果我做错了,那将是非常无益的。从目前的答案来看,似乎没有可靠的方法可以做到这一点)。

6个回答

试试这个,在用户代理字符串中查找 WOW64(64 位上的 32 位)或 Win64(本机 64 位)。

    if (navigator.userAgent.indexOf("WOW64") != -1 || 
        navigator.userAgent.indexOf("Win64") != -1 ){
       alert("This is a 64 bit OS");
    } else {
       alert("Not a 64 bit OS");
    }

我认为最好假设用户此时拥有 x64。使用选择加入检测算法来检测超过 99.5% 的消费者拥有的架构,现在应该会产生更多的误报,而不仅仅是假设他们都拥有它。
2021-03-14 07:14:46
这很有效,除了 64 位 Windows 7 上的 Safari,它缺少 WOW64,缺少 Win64,并报告window.navigator.platform为 win32。我已经在 Safari 4/Win 中试过了;以后的版本可能会改变。
2021-03-29 07:14:46
不是 100% 准确,但这是一个很好的线索,因为没有更好的方法来可靠地检测它。
2021-04-08 07:14:46

我做了一些测试。结果如下,希望对你有帮助:

64 位 MacOS + 64 位 Safari 或 32 位 Chrome:
window.navigator.platform=MacIntel

32 位 Windows + Safari:
window.navigator.platform=Win32

64 位 Windows + 64 位 IE:
window.navigator.platform=Win64
window.navigator.cpuClass=x64

64 位 Windows + 32 位 IE:
window.navigator.platform=Win32
window.navigator.cpuClass=x86

64 位 Windows + 32 Firefox(或 Chrome):
window.navigator.platform=Win32

32 位 linux mint (i686) + firefox:
window.navigator.platform=Linux i686

64 位 Ubuntu (x86_64) + 32 位 Chrome:
window.navigator.platform=Linux i686

64 位 Ubuntu + 64 位顿悟:
window.navigator.platform=Linux x86_64

到目前为止,我已经使用了这个代码:

deployJava.isWin64OS = function() {
    return navigator.userAgent.indexOf('WOW64')>-1 || window.navigator.platform=='Win64';
};
那是不准确的。带有 Chrome 64 位的 Windows 64 位也产生“Win32”。
2021-03-26 07:14:46

分析了大约14000 个独特的用户代理来自这里),我想出了以下字符串来查找:

  • x86_64
  • x86-64
  • Win64
  • x64; (注意分号!没有它,你会有误报。)
  • amd64
  • AMD64
  • 魔兽64
  • x64_64

此外,尽管它们具有不同的指令集并且与 Intel x86_64 不兼容,但您可能需要检测以下内容:

  • ia64
  • sparc64
  • ppc64
  • IRIX64

但请注意,不要只查找包含“64”甚至“x64”的任何内容。Chrome 的内部版本号、蜘蛛程序/机器人程序、库、.NET 版本、分辨率等也可能包含字符串“x64”,但仍然是 32 位(或其他)操作系统。

请注意,您可以不区分大小写地搜索所有这些字符串。

我在 ARM 上找不到任何东西。也许是别人?请编辑,这是一个社区维基。

我正在针对 UA 字符串中的 RegExp `/\barm/i 进行测试。“arm”之前的单词边界很重要,否则它也会匹配 Ubuntu 9.10 (Karmic Koala) 的 UA 字符串。我已经基于useragentstring.com/pages/Allcode.google.com/p/google-web-toolkit/issues/detail?id=8038上的一些 UA 字符串构建了这个模式
2021-03-18 07:14:46

您可以检查window.navigator.platformwindow.navigator.cpuClass

我不确定你的情况,但我会考虑做大多数其他网站所做的事情,让用户选择他们得到的下载。他们可能正在为另一台机器下载它,放在闪存设备上,或者只是希望 32 位版本在他们的 64 位机器上运行。不管什么原因,我宁愿有选择。

在我工作的地方,很长一段时间以来,我们都有所有可用的下载选项,但用户经常会犯错误,为他们的系统下载错误的版本。
2021-03-18 07:14:46
大多数用户在不确定时只会选择第一个。当你想给用户一个推荐时,你可以把这个版本放在最前面,甚至可以让它比其他的大一点。
2021-03-18 07:14:46
Windows 7 上的 Firefox,64 位:navigator.cpuClass === undefined, navigator.platform === "Win32". IE9同一台机器上,navigator.cpuClsas === "x86"这些都不是检测 64 位 Windows 的任何用途。但是,navigator.userAgent确实包含WOW64,因此该答案是有效的。
2021-03-18 07:14:46

最可靠的解决方案是创建一个 32 位加载器应用程序,它会检测架构,然后下载并安装应用程序的适当版本。

我已经检查了 RC 和 Pino 的另外两个答案。由于与您建议的相同的问题,它们都不起作用 - 64 位 Windows 上的 32 位 IE 会将平台错误地识别为 32 位。由于大多数人在 64 位 Windows 上运行 32 位 IE(许多插件例如 Flash 在 64 位下不可用),因此会有很多不准确的识别

我绝对讨厌这些安装程序,但这是一个选项,请不要惹恼您的用户,迫使他们也安装您漂亮的工具栏。
2021-03-21 07:14:46
我认为最好和最用户友好的解决方案。
2021-03-24 07:14:46
我猜有人(不是我)投票否决了它,因为它没有直接回答问题。但是,这是完成我想做的事情的另一种方式。
2021-03-28 07:14:46
32 位 IE 包含 WOW64 令牌,因此很容易挑选出来。
2021-04-04 07:14:46