如何判断iOS Widget在开启「使用iPhone Widgets」的Mac上运行?
判断运行在Mac上的iPhone Widget的方法
由于这种从iPhone迁移到Mac的Widget是在Rosetta模拟的iOS环境中运行,常规的Catalyst应用判断手段(如ProcessInfo.processInfo.isiOSAppOnMac、用户文档路径)无法生效,以下是几种可靠的判断方式:
1. 读取系统注入的环境变量
Mac在运行iPhone应用/Widget时会注入__IS_MAC_ENVIRONMENT__环境变量,直接检查该变量即可:
func isRunningOnMacAsIPhoneWidget() -> Bool { return ProcessInfo.processInfo.environment["__IS_MAC_ENVIRONMENT__"] != nil }
2. 通过设备模型标识符判断
运行在Mac上的iPhone Widget,其设备模型会包含Mac相关的型号标识(如MacBookPro18,3),可以通过获取设备型号来判断:
import UIKit func isRunningOnMac() -> Bool { return UIDevice.current.modelIdentifier.contains("Mac") } // 扩展UIDevice获取具体型号标识符 extension UIDevice { var modelIdentifier: String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) return machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } } }
3. 辅助判断:屏幕尺寸特性
Mac的屏幕通常具备更大的分辨率,可作为辅助判断依据(需结合你的Widget适配场景调整阈值):
func isLikelyRunningOnMac() -> Bool { // 示例:判断屏幕宽度是否超过1024(多数Mac屏幕的最小宽度) return UIScreen.main.bounds.width > 1024 }
优先级建议
优先使用环境变量检查的方法,这是系统直接提供的标识,准确性最高;设备型号判断次之;屏幕尺寸仅作为补充验证手段。
内容的提问来源于stack exchange,提问作者Type11
相关产品推荐
相关产品推荐

