Mac App运行时如何以编程方式检测设备为Intel或Apple Silicon芯片
运行时检测Mac设备芯片类型的编程方案
通用兼容方案(支持所有macOS版本)
最稳妥的实现是通过sysctl系统调用读取硬件属性,该方案不受应用是否运行在Rosetta转译环境的影响,始终返回真实的硬件芯片类型。
使用时需要先导入sys/sysctl.h头文件:
Swift 代码示例
import Foundation func isRunningOnAppleSilicon() -> Bool { var arm64Check: Int32 = 0 var size = MemoryLayout<Int32>.size guard sysctlbyname("hw.optional.arm64", &arm64Check, &size, nil, 0) == 0 else { return false } return arm64Check != 0 } // 返回true为Apple Silicon,返回false为Intel处理器
Objective-C 代码示例
#include <sys/sysctl.h> - (BOOL)isRunningOnAppleSilicon { int32_t arm64Check = 0; size_t size = sizeof(arm64Check); if (sysctlbyname("hw.optional.arm64", &arm64Check, &size, NULL, 0) != 0) { return NO; } return arm64Check != 0; }
极简方案(仅支持macOS 11及以上)
如果你的应用最低兼容版本为macOS 11 Big Sur及以上,可以直接使用ProcessInfo的内置属性判断,逻辑更简单:
Swift 代码示例
func isRunningOnAppleSilicon() -> Bool { if #available(macOS 11.0, *) { // 若应用是被Rosetta转译运行,硬件必然是Apple Silicon if ProcessInfo.processInfo.isTranslated { return true } // 非转译环境下直接判断当前运行架构 return ProcessInfo.processInfo.architecture == .arm64 } else { // 低于11版本的系统不存在Apple Silicon设备,直接返回false return false } }
注意事项
- 不要使用编译时宏(比如Swift的
#if arch(arm64)、OC的#if defined(__arm64__))做判断,这类宏只能识别你当前打包的二进制架构,无法覆盖Intel二进制跑在Apple Silicon Rosetta转译环境的场景,会返回错误结果。 - 若需要在Shell脚本中检测,可以直接执行命令:
sysctl -n machdep.cpu.brand_string,输出包含Apple即为Apple Silicon芯片,包含Intel即为Intel处理器。
内容的提问来源于stack exchange,提问作者Todd Ditchendorf
相关产品推荐
相关产品推荐

