从 WatchOS 捕获 Apple Watch 的型号标识符

Posted

技术标签:

【中文标题】从 WatchOS 捕获 Apple Watch 的型号标识符【英文标题】:Capture model identifier for Apple Watch from WatchOS 【发布时间】:2020-10-21 01:26:38 【问题描述】:

似乎没有任何记录在案的从手表应用程序获取 Apple Watch 模型的官方方法,但有这篇文章显示了 sysctlbyname 的特殊用法:

How to determine the Apple Watch model?

谁能帮我弄清楚为什么这个功能不起作用?它有时会返回

“看\t”

而不是预期的

“手表2,4”

Swift 的 sysctlbyname 函数似乎是这里描述的这个 c 函数: https://opensource.apple.com/source/Libc/Libc-167/gen.subproj/sysctlbyname.c.auto.html

我的代码是从 SO 帖子中的快速答案复制而来的:

private 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)
   return String(cString: &machine, encoding: String.Encoding.utf8)?.trimmingCharacters(in: .whitespacesAndNewlines)
 // Should return a string like "Watch2,4"

【问题讨论】:

查看您的代码可能会很有用。它适用于 macOS 吗?如果没有,在 macOS 上调试可能比在 watchOS 上更容易。 另外,你提到的“有时”让我觉得你可能以某种方式滥用了缓冲区——要么过早地释放缓冲区,要么没有为它分配足够的空间。 @nneonneo 这些想法很好。我还没有尝试在另一个平台上进行测试。我已将我的代码添加到帖子中(与链接的 SO 帖子中的代码相同)。 老实说,我对缓冲区如何在这里被滥用并不太熟悉,我相信原作者。不过,获得一些见解会非常有趣。 【参考方案1】:

您永远不会分配缓冲区来接收机器字符串。 改变

var machine = CChar()

var machine = [CChar](repeating: 0, count: size) 

你应该很高兴!

【讨论】:

不错!这是有道理的。我现在正在测试这个,但我可能需要一段时间才能确认它是否有效,我可以批准你的答案。谢谢!但是,我应该指出这个特定的代码无法编译...我将其更改为 Array(repeating... 哎呀,错字了!会更新!正如您所指出的,应该是[CChar](repeating: 0, count: size) Array<CChar>... 感谢您的解决方案。在模拟器上,它提供了 Mac 机器。反正有没有在模拟器上测试这个? @claude31 无论如何我都不知道(除了模拟呼叫)要在模拟器上测试它。 谢谢,我就是这么想的。在一个应用程序中,我需要检测 watch 7 是否(因为 insets 修改)。我终于用屏幕边界大小来测试它是不是Watch 7。

以上是关于从 WatchOS 捕获 Apple Watch 的型号标识符的主要内容,如果未能解决你的问题,请参考以下文章

这些 Apple Watch 型号与 watchOS 8 兼容

为啥红蜘蛛不再在真正的 Apple Watch (WatchOS 6) 上运行?

在 Apple Watch 上以编程方式通知。 (WatchOS 3)

WatchKit WatchOS - Apple Watch 上从未显示定位服务提示

重启后 Apple Watch 4 启动时自动启动后台 WatchOS 应用程序

XCode 11.3 崩溃,iOS 13.2.2 模拟器 iPhone X 和 watchOS 4.2 Apple Watch 42mm