有没有办法在 JavaScript 中检测 Apple Silicon Mac?
中的属性navigator
似乎不是很有帮助,例如navigator.platform
设置为MacIntel
和用户代理完全一样。
原因部分:我有两个可用的软件版本,用于 Intel 和 Apple Silicon。询问用户“你的 Mac 是 Apple Silicon 还是 Intel?” 不是很好。
有没有办法在 JavaScript 中检测 Apple Silicon Mac?
中的属性navigator
似乎不是很有帮助,例如navigator.platform
设置为MacIntel
和用户代理完全一样。
原因部分:我有两个可用的软件版本,用于 Intel 和 Apple Silicon。询问用户“你的 Mac 是 Apple Silicon 还是 Intel?” 不是很好。
我有一个解决方案,但感觉很脆弱。
检查操作系统,因为 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)。
您可以使用一个库,它为您提供有关 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
预期结果。