13

有没有办法在 JavaScript 中检测 Apple Silicon Mac?
中的属性navigator似乎不是很有帮助,例如navigator.platform设置为MacIntel和用户代理完全一样。

原因部分:我有两个可用的软件版本,用于 Intel 和 Apple Silicon。询问用户“你的 Mac 是 Apple Silicon 还是 Intel?” 不是很好。

4

2 回答 2

8

我有一个解决方案,但感觉很脆弱。

检查操作系统,因为 Apple Silicon 仅存在于 10_15 或更高版本:

navigator.userAgent.match(/OS X 10_([789]|1[01234])/)

使用 webgl 检查 GPU:

var w = document.createElement("canvas").getContext("webgl");
var d = w.getExtension('WEBGL_debug_renderer_info');
var g = d && w.getParameter(d.UNMASKED_RENDERER_WEBGL) || "";
if (g.match(/Apple/) && !g.match(/Apple GPU/)) {
   ...definitely arm...
}

如果您看到 Apple GPU,那么它就是 Safari,它隐藏了 GPU 以防止指纹识别。挖掘能力:

if (w.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb") == -1) {
  ...probably arm...
}

(我将我的 MacBook Pro 的功能与新的 M1 Air 进行了比较,但 Air 上没有那个。所有其他的都是相同的。)

我正在采取的方法是给用户一个选择,但是使用这个测试来选择默认值。

如果有人有其他想法,如果它是 M1,可能有助于缩小范围,我很乐意尝试......

更新:正如 Romain 在评论中指出的那样,Apple 增加了对 Big Sur 中缺少的扩展的支持,所以这现在不起作用(在 Safari 中;它仍然适用于 Chrome 和 Firefox)。

于 2020-12-22T16:32:16.530 回答
1

您可以使用一个库,它为您提供有关 Node.js 中的操作系统的信息 - os ( const os = require('os'))。它有一个返回 cpu 核心的方法 - os.cpus(),你可以只取第一个元素并检查它是否是你想要的确切模型,或者它是否只是在其模型中包含“Apple M1”作为字符串 - let isM1 = cpuCore[0].model.includes("Apple M1")

您也可以检查该os.arch()方法:

返回为其编译 Node.js 二进制文件的操作系统 CPU 架构。

但是,我建议在使用 arch 方法时要高度谨慎,因为我曾多次出现 M1 Macx64从其返回os.arch()而不是arm64预期结果。

于 2021-10-14T10:38:42.490 回答