有没有办法在JavaScript中检测Apple Silicon Mac?
navigator中的属性似乎没有太大帮助,例如,navigator.platform设置为MacIntel,而用户代理完全相同。
原因:我有两个版本的软件可供选择,分别是英特尔和Apple Silicon。问用户“你的Mac是Apple Silicon还是Intel?”不是很好。
发布于 2020-12-23 00:32:17
我有一个解决方案,但感觉很脆弱。
检查操作系统,因为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的范围,我很乐意尝试一下……
更新:正如Romain在评论中指出的那样,苹果在Big Sur中添加了对缺少的扩展的支持,所以它现在不能工作(在Safari中;它仍然可以在Chrome和Firefox中使用)。
发布于 2021-10-14 10:38:42
有一个库可以为您提供有关Node.js - os (const os = require('os'))中的操作系统的信息。它有一个返回cpu核心的方法- os.cpus(),你可以只取第一个元素,然后检查它是不是你想要的模型,或者它是否只是在它的模型- let isM1 = cpuCore[0].model.includes("Apple M1")中包含一个字符串"Apple M1“。
还可以检查os.arch()方法,因为它:
CPU返回为其编译Node.js二进制文件的操作系统
体系结构。
然而,我建议在使用arch方法时要高度注意,因为我有几次M1 Mac从os.arch()返回x64而不是arm64的情况,这是预期的结果。
https://stackoverflow.com/questions/65146751
复制相似问题