如何确定Apple Watch具体型号?iOS端精确获取型号方法咨询
嘿,我正好踩过这个坑!确实,WKInterfaceDevice.current().model对Apple Watch特别敷衍,只会返回干巴巴的"Apple Watch",根本拿不到具体型号编号。不过从iOS端我们有两种靠谱的方法来获取精确型号,给你唠唠:
方法1:通过Watch Connectivity跨设备传输硬件信息
这是最直接的方案——在Watch Extension里读取底层的硬件型号代码,再通过Watch Connectivity把这个值传到iOS端。
原理
WatchOS的ProcessInfo里可以读取到环境变量hw.machine,它会返回具体的型号代码(比如Watch6,2对应Apple Watch Series 6 GPS版),我们只需要把这个代码传到iOS端,再映射成用户易懂的型号名称就行。
Watch Extension端代码
import WatchConnectivity import Foundation // 确保先配置好WCSession class WatchExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate { func applicationDidFinishLaunching() { if WCSession.isSupported() { let session = WCSession.default session.delegate = self session.activate() // 获取硬件型号代码 if let hwMachine = ProcessInfo.processInfo.environment["hw.machine"] { // 发送到iOS主App session.sendMessage(["watchModelCode": hwMachine], replyHandler: nil, errorHandler: { error in print("发送型号信息失败: \(error.localizedDescription)") }) } } } // 实现必需的WCSession代理方法 func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {} }
iOS主App端代码
import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate { override func viewDidLoad() { super.viewDidLoad() // 初始化WCSession if WCSession.isSupported() { let session = WCSession.default session.delegate = self session.activate() } } // 接收Watch传来的型号代码 func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { guard let modelCode = message["watchModelCode"] as? String else { return } // 把型号代码映射成可读的型号名称(可以根据需要补充更多型号) let modelMap: [String: String] = [ "Watch1,1": "Apple Watch Series 1", "Watch2,6": "Apple Watch Series 2 GPS", "Watch3,1": "Apple Watch Series 3 GPS", "Watch4,1": "Apple Watch Series 4 GPS", "Watch5,1": "Apple Watch Series 5 GPS", "Watch6,2": "Apple Watch Series 6 GPS", "Watch7,1": "Apple Watch Series 7 GPS", "Watch8,1": "Apple Watch Series 8 GPS", "WatchUltra1,1": "Apple Watch Ultra", "WatchSE2,1": "Apple Watch SE (第2代) GPS" ] let readableModel = modelMap[modelCode] ?? "未知Apple Watch型号" print("配对的Apple Watch型号: \(readableModel)") // 这里可以把型号展示给用户或者做后续处理 } // 实现必需的WCSession代理方法 func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {} }
方法2:借助HealthKit获取配对设备信息
如果你的App本身就用到了HealthKit,这个方法会更顺手——通过HealthKit查询用户配对的Apple Watch设备信息。
原理
HealthKit会记录用户关联的所有健康设备,我们可以通过设备类型筛选出Apple Watch,然后读取它的model属性(同样是型号代码)。
iOS端代码示例
import HealthKit class HealthKitModelFetcher { private let healthStore = HKHealthStore() func fetchWatchModel() { guard HKHealthStore.isHealthDataAvailable() else { print("当前设备不支持HealthKit") return } // 请求设备信息读取权限 let readTypes: Set<HKObjectType> = [HKDeviceType.deviceType()] healthStore.requestAuthorization(toShare: nil, read: readTypes) { [weak self] success, error in guard success, let self = self else { print("HealthKit授权失败: \(error?.localizedDescription ?? "未知错误")") return } // 筛选出Apple Watch设备 let watchPredicate = HKDevice.predicateForDevices(with: .watch) let query = HKAnchoredObjectQuery(type: HKDeviceType.deviceType(), predicate: watchPredicate, anchor: nil, limit: HKObjectQueryNoLimit) { _, results, _, error in guard let devices = results as? [HKDevice], let watchDevice = devices.first else { print("未找到配对的Apple Watch") return } if let modelCode = watchDevice.model { // 同样用映射字典转换成可读名称 let modelMap: [String: String] = [ "Watch6,2": "Apple Watch Series 6 GPS", // 补充更多型号映射 ] let readableModel = modelMap[modelCode] ?? "未知Apple Watch型号" print("Apple Watch型号: \(readableModel)") } } self.healthStore.execute(query) } } }
注意事项
hw.machine的型号代码没有公开的官方完整列表,但社区里有很多整理好的映射表,你可以根据需要补充到自己的字典里。- 方法2依赖HealthKit权限,需要用户主动授权,所以只适合本身就集成了HealthKit的App。
- 两种方法都需要确保Apple Watch和iOS设备处于配对且连接状态。
内容的提问来源于stack exchange,提问作者Manuel




