You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何确定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

火山引擎 最新活动