如何确定 Apple Watch 的型号?

10
WKInterfaceDevice.current().model属性不能提供模型号:

对于Apple Watch,该字符串的值为Apple Watch

如何从iOS中确定精确的Apple Watch型号? Watch app screenshot, image credits https://support.apple.com/en-us/HT204507
5个回答

10

针对WatchOS 6和Apple Watch Series 5,稍微更新了@Mathieu Vandeginste的答案。

private func getWatchModel() -> String? {
    var size: size_t = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = [CChar](repeating: 0, count: size)
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    return String(cString: &machine, encoding: String.Encoding.utf8)?.trimmingCharacters(in: .whitespacesAndNewlines)
}

为了适应 WatchOS 5,需要对getWatchModel()返回的原始字符串进行修剪,因为现在它以制表符结尾,使用以下代码进行修剪: ?.trimmingCharacters(in: .whitespacesAndNewlines)

private func getWatchName(model: String) -> String {
    switch model {
        case "Watch1,1":
            return "Apple Watch Series 0 38mm"
        case "Watch1,2":
            return"Apple Watch Series 0 42mm"
        case "Watch2,3":
            return "Apple Watch Series 2 38mm"
        case "Watch2,4":
            return "Apple Watch Series 2 42mmm"
        case "Watch2,6":
            return "Apple Watch Series 1 38mm"
        case "Watch2,7":
            return "Apple Watch Series 1 42mm"
        case "Watch3,1":
            return "Apple Watch Series 3 38mm Cellular"
        case "Watch3,2":
            return "Apple Watch Series 3 42mm Cellular"
        case "Watch3,3":
            return "Apple Watch Series 3 38mm"
        case "Watch3,4":
            return "Apple Watch Series 3 42mm"
        case "Watch4,1":
            return "Apple Watch Series 4 40mm"
        case "Watch4,2":
            return "Apple Watch Series 4 44mm"
        case "Watch4,3":
            return "Apple Watch Series 4 40mm Cellular"
        case "Watch4,4":
            return "Apple Watch Series 4 44mm Cellular"
        case "Watch5,1":
            return "Apple Watch Series 5 40mm"
        case "Watch5,2":
            return "Apple Watch Series 5 44mm"
        case "Watch5,3":
            return "Apple Watch Series 5 40mm Cellular"
        case "Watch5,4":
            return "Apple Watch Series 5 44mm Cellular"
        case "Watch5,9":
            return "Apple Watch SE 40mm"
        case "Watch5,10":
            return "Apple Watch SE 44mm"
        case "Watch5,11":
            return "Apple Watch SE 40mm Cellular"
        case "Watch5,12":
            return "Apple Watch SE 44mm Cellular"
        case "Watch6,1":
            return "Apple Watch Series 6 40mm"
        case "Watch6,2":
            return "Apple Watch Series 6 44mm"
        case "Watch6.3":
            return "Apple Watch Series 6 40mm Cellular"
        case "Watch6,4":
            return "Apple Watch Series 6 44mm Cellular"
        case "Watch6,6":
            return "Apple Watch Series 7 41mm"
        case "Watch6,7":
            return "Apple Watch Series 7 45mm"
        case "Watch6,8":
            return "Apple Watch Series 7 41mm Cellular"
        case "Watch6,9":
            return "Apple Watch Series 7 45mm Cellular"
        default:
            return "unknown"
    }
}

根据这篇文章,我们刚刚添加了新的模型到上面。


这个在 Debug 构建中可以工作,但是在 Release 构建中不行。在 Release 构建中,getWatchModel 函数返回 Watc\t,对于我的 Series 3 42mm 来说是错误的。 - itskoBits

5

没有公共API可以获取精确信息。

但是,您可以使用以下方法(我会让您将其翻译为Swift):

- (NSString*) modelIdentifier {
    size_t size = 0;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char* machine = malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString* model = [NSString stringWithCString: machine encoding: NSUTF8StringEncoding];
    free(machine);
    return model;
}

该函数返回一个格式为"Watch1,1"的字符串,您需要提供一个查找表来进行ID->名称的转换。

"Watch1,1" -> Apple Watch 38mm
"Watch1,2" -> Apple Watch 42mm
"Watch2,3" -> Apple Watch Series 2 38mm
"Watch2,4" -> Apple Watch Series 2 42mm
"Watch2,6" -> Apple Watch Series 1 38mm
"Watch2,7" -> Apple Watch Series 1 42mm
"Watch3,1" -> Apple Watch Series 3 38mm Cellular
"Watch3,2" -> Apple Watch Series 3 42mm Cellular
"Watch3,3" -> Apple Watch Series 3 38mm
"Watch3,4" -> Apple Watch Series 3 42mm

顺便提一下,这个sysctlbyname API也适用于iOS。
祝好。

正是我正在寻找的。这是否使用私有API,还是可以安全地提交到应用商店? - Manuel
我应该澄清一下,我想从在iOS上调用的方法(即在iOS应用程序上)确定手表型号,而不是在watchOS上。 - Manuel
3
这是一个公共API,那么应用商店安全吗?该代码可以在iOS和watchOS上编译。在iOS上,它将显然返回字符串“iPhone5,1”等,而在watchOS上,它将返回“Watch3,1”等。如果您需要从iOS应用程序中获取手表型号,则需要让手表应用程序通过WCSession将模型ID发送到您的iOS应用程序。 - appfigurate

5

编辑:不再适用于watchOS 4+

这是Swift 4+版本:对我来说运行良好 :)

func getWatchModel() -> String {
    var size: size_t = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = CChar()
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    let model = String(cString: &machine, encoding: String.Encoding.utf8)
    switch model {
    case "Watch1,1":
        return "Apple Watch 28mm"
    case "Watch1,2":
        return"Apple Watch 42mm"
    case "Watch2,3":
        return "Apple Watch Series 2 38mm"
    case "Watch2,4":
        return "Apple Watch Series 2 42mmm"
    case "Watch2,6":
        return "Apple Watch Series 1 38mm"
    case "Watch2,7":
        return "Apple Watch Series 1 42mm"
    case "Watch3,1":
        return "Apple Watch Series 3 38mm Cellular"
    case "Watch3,2":
        return "Apple Watch Series 3 42mm Cellular"
    case "Watch3,3":
        return "Apple Watch Series 3 38mm"
    case "Watch3,4":
        return "Apple Watch Series 3 42mm"
    default:
        return "unknown"
    }
}

这看起来像是从watchOS调用的,但问题是针对iOS的。 - Manuel
2
没错,Objective-C 代码也是这样做的。如果你在 iOS 上运行它,你会得到 iPhone 的型号标识符。我的做法是在我的手表界面上运行这段代码,通过 WatchConnectivity 发送到 iOS 并发送到我的分析工具。 - matmat
1
@Mathieu Vandeginste的回答是正确的,而且非常到位,因为问题涉及WKInterfaceDevice,它恰好是手表。 - BootMaker
4
在watchOS 5下,这个不再起作用了。 model的值现在是" Watc\t",因此从switch case返回的整体响应始终是“未知的”。 - Luke
解决方案将在watchOS 9 / iOS 16上崩溃 - 必须实现@TealShift建议的大小分配 :) - VincentLoi
显示剩余2条评论

3

已更新以适用于watchOS 8和Apple Watch Series 7

其他答案称由于该函数返回Watc\t而无法工作,本文修正了此问题。

public func getWatchModel() -> String? {
    var size: size_t = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = [CChar](repeating: 0, count: size)
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    return String(cString: &machine, encoding: String.Encoding.utf8)?.trimmingCharacters(in: .whitespacesAndNewlines)
}

public func getWatchName(model: String) -> String {
    switch model {
    case "Watch1,1":
        return "Apple Watch Series 0 38mm"
    case "Watch1,2":
        return"Apple Watch Series 0 42mm"
    case "Watch2,3":
        return "Apple Watch Series 2 38mm"
    case "Watch2,4":
        return "Apple Watch Series 2 42mmm"
    case "Watch2,6":
        return "Apple Watch Series 1 38mm"
    case "Watch2,7":
        return "Apple Watch Series 1 42mm"
    case "Watch3,1":
        return "Apple Watch Series 3 38mm Cellular"
    case "Watch3,2":
        return "Apple Watch Series 3 42mm Cellular"
    case "Watch3,3":
        return "Apple Watch Series 3 38mm"
    case "Watch3,4":
        return "Apple Watch Series 3 42mm"
    case "Watch4,1":
        return "Apple Watch Series 4 40mm"
    case "Watch4,2":
        return "Apple Watch Series 4 44mm"
    case "Watch4,3":
        return "Apple Watch Series 4 40mm Cellular"
    case "Watch4,4":
        return "Apple Watch Series 4 44mm Cellular"
    case "Watch5,1":
        return "Apple Watch Series 5 40mm"
    case "Watch5,2":
        return "Apple Watch Series 5 44mm"
    case "Watch5,3":
        return "Apple Watch Series 5 40mm Cellular"
    case "Watch5,4":
        return "Apple Watch Series 5 44mm Cellular"
    case "Watch5,9":
        return "Apple Watch SE 40mm"
    case "Watch5,10":
        return "Apple Watch SE 44mm"
    case "Watch5,11":
        return "Apple Watch SE 40mm Cellular"
    case "Watch5,12":
        return "Apple Watch SE 44mm Cellular"
    case "Watch6,1":
        return "Apple Watch Series 6 40mm"
    case "Watch6,2":
        return "Apple Watch Series 6 44mm"
    case "Watch6.3":
        return "Apple Watch Series 6 40mm Cellular"
    case "Watch6,4":
        return "Apple Watch Series 6 44mm Cellular"
    case "Watch6,6":
        return "Apple Watch Series 7 41mm"
    case "Watch6,7":
        return "Apple Watch Series 7 45mm"
    case "Watch6,8":
        return "Apple Watch Series 7 41mm Cellular"
    case "Watch6,9":
        return "Apple Watch Series 7 45mm Cellular"
    case "x86_64":
        return "Apple Watch Series 9 Simulator"
    default:
        return "unknown"
    }
}

这是唯一对我有效的答案。谢谢 :)! - itskoBits

1

适用于watchOS 9和Series 8/Ultra/SE2的更新

public func getWatchModel() -> String? {
    var size: size_t = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = [CChar](repeating: 0, count: size)
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    return String(cString: &machine, encoding: String.Encoding.utf8)?.trimmingCharacters(in: .whitespacesAndNewlines)
}

public func getWatchName(model: String) -> String {
    switch model {
    case "Watch1,1":
        return "Apple Watch Series 0 38mm"
    case "Watch1,2":
        return"Apple Watch Series 0 42mm"
    case "Watch2,3":
        return "Apple Watch Series 2 38mm"
    case "Watch2,4":
        return "Apple Watch Series 2 42mmm"
    case "Watch2,6":
        return "Apple Watch Series 1 38mm"
    case "Watch2,7":
        return "Apple Watch Series 1 42mm"
    case "Watch3,1":
        return "Apple Watch Series 3 38mm Cellular"
    case "Watch3,2":
        return "Apple Watch Series 3 42mm Cellular"
    case "Watch3,3":
        return "Apple Watch Series 3 38mm"
    case "Watch3,4":
        return "Apple Watch Series 3 42mm"
    case "Watch4,1":
        return "Apple Watch Series 4 40mm"
    case "Watch4,2":
        return "Apple Watch Series 4 44mm"
    case "Watch4,3":
        return "Apple Watch Series 4 40mm Cellular"
    case "Watch4,4":
        return "Apple Watch Series 4 44mm Cellular"
    case "Watch5,1":
        return "Apple Watch Series 5 40mm"
    case "Watch5,2":
        return "Apple Watch Series 5 44mm"
    case "Watch5,3":
        return "Apple Watch Series 5 40mm Cellular"
    case "Watch5,4":
        return "Apple Watch Series 5 44mm Cellular"
    case "Watch5,9":
        return "Apple Watch SE 40mm"
    case "Watch5,10":
        return "Apple Watch SE 44mm"
    case "Watch5,11":
        return "Apple Watch SE 40mm Cellular"
    case "Watch5,12":
        return "Apple Watch SE 44mm Cellular"
    case "Watch6,1":
        return "Apple Watch Series 6 40mm"
    case "Watch6,2":
        return "Apple Watch Series 6 44mm"
    case "Watch6,3":
        return "Apple Watch Series 6 40mm Cellular"
    case "Watch6,4":
        return "Apple Watch Series 6 44mm Cellular"
    case "Watch6,6":
        return "Apple Watch Series 7 41mm"
    case "Watch6,7":
        return "Apple Watch Series 7 45mm"
    case "Watch6,8":
        return "Apple Watch Series 7 41mm Cellular"
        fallthrough
    case "Watch6,9":
        return "Apple Watch Series 7 45mm Cellular"
    case "Watch6,10":
        return "Apple Watch SE 2 40mm"
    case "Watch6,11":
        return "Apple Watch SE 2 44mm"
    case "Watch6,12":
        return "Apple Watch SE 2 40mm Cellular"
    case "Watch6,13":
        return "Apple Watch SE 2 44mm Cellular"
    case "Watch6,14":
        return "Apple Watch Series 8 41mm"
    case "Watch6,15":
        return "Apple Watch Series 8 45mm"
    case "Watch6,16":
        return "Apple Watch Series 8 41mm Cellular"
    case "Watch6,17":
        return "Apple Watch Series 8 45mm Cellular"
    case "Watch6,18":
        return "Apple Watch Ultra"
    case "x86_64":
        return "Apple Watch Series 9 Simulator"
    default:
        return "unknown"
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接