在JavaScript中检测Apple Silicon mac



有办法在JavaScript中检测Apple Silicon Mac吗
navigator中的属性似乎没有太大帮助,例如,navigator.platform设置为MacIntel,并且用户代理完全相同。

原因部分:我有两个版本的软件,英特尔和苹果硅。询问用户";你的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...
}

如果你看到苹果GPU,那么Safari会隐藏GPU以防止指纹识别。深入挖掘功能:

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

(我将我的MacBook Pro的功能与一款新的M1 Air进行了比较,但Air上缺少了这一款。其他的都是一样的。(

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

如果有人对某种特殊的东西有另一种想法,如果它是M1,我很乐意尝试。。。

更新:正如罗曼在评论中指出的,苹果在Big Sur中添加了对缺失扩展的支持,所以现在这不起作用(在Safari中;它仍然在Chrome和Firefox中起作用(。

这现在可以通过navigator.userAgentData实现,尽管并非所有浏览器都支持它。

await navigator.userAgentData.getHighEntropyValues(['architecture'])
{
architecture: "arm"
brands: [{…}, {…}, {…}],
mobile: false,
platform: "macOS"
}

https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues

有一个库可以用来提供Node.js-os(const os = require('os')(中操作系统的信息。它有一个返回cpu核心的方法——os.cpus(),你可以只取第一个元素,检查它是否是你想要的确切模型,或者它是否只是包含";Apple M1";作为其模型CCD_ 7中的字符串。

您也可以检查os.arch()方法,因为它是:

返回Node.js所在的操作系统CPU体系结构二进制文件已编译。

但是,我建议在使用arch方法时要高度小心,因为我已经发生过多次事件,其中M1 Mac从os.arch()返回x64,而不是预期结果arm64

编辑:用正则表达式或cpuCore[0].model.includes("Apple")替换cpuCore[0].model.includes("Apple M1")可能更好,因为最早版本的M1 Mac在型号下返回"苹果处理器"。

最新更新