从 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[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