如何通过预处理指令检测以Designed for iPad目标运行在macOS上?
检测Designed for iPad应用运行在Mac上的预处理指令方案
现有方案分析
你提到的#if arch(arm64) && os(iOS) && !targetEnvironment(simulator)确实能覆盖大部分Designed for iPad运行在Apple Silicon Mac上的场景,但存在局限性:未来若Mac推出新架构(如arm128),该条件会失效。另外,现有常规宏的问题:
#if targetEnvironment(macCatalyst):仅针对Mac Catalyst目标,不适用Designed for iPad场景(这类App本质仍是iOS目标)#if os(macOS)/#if !os(iOS):完全无效,因为Designed for iPad运行时仍被识别为iOS环境
更优方案推荐
方案1:编译条件+运行时检测(推荐)
若要兼顾预处理过滤的需求与检测准确性,建议用编译条件缩小范围,再通过官方运行时API做最终判断:
#if arch(arm64) && os(iOS) && !targetEnvironment(simulator) if ProcessInfo.processInfo.isiOSAppOnMac { // 处理Designed for iPad在Mac上运行的逻辑 } #endif
这种方式既减少了运行时判断的场景,又避免了架构变更带来的兼容问题。
方案2:更精准的纯预处理组合
如果必须用纯预处理指令,可添加!targetEnvironment(macCatalyst)排除Mac Catalyst场景,进一步精准定位:
#if arch(arm64) && os(iOS) && !targetEnvironment(simulator) && !targetEnvironment(macCatalyst) // 代码仅在Designed for iPad运行在Apple Silicon Mac上时编译 #endif
注意:该方案仍依赖arm64架构,未来Mac架构更新时需同步调整条件。
重要提示
目前苹果官方并未为Designed for iPad on Mac提供专属预处理宏,因此纯预处理方案均存在一定的未来兼容风险,优先推荐「编译条件+运行时检测」的组合。
内容的提问来源于stack exchange,提问作者Jeshua Lacock
相关产品推荐
相关产品推荐

