Apple Watch电池电量充电通知

我决定写这篇关于如何构建watchOS应用程序来解决一个小问题的快速文章。 这里有一个随附的Stack Overflow帖子。

当我从隔夜充电的Series 0 Apple Watch升级到Series 3时,我切换到了更零星的充电时间表。

由于Series 3在一天结束时不会像原来的Apple Watch一样耗尽电池电量,因此我开始过夜佩戴它来跟踪睡眠。 然后,我会每天将其扔到充电器上一次或两次,以保持良好的充电效果。

随机充电足以使它在大多数时间都能正常运行,但有时我会把它留在充电器上而忘了。 有时候在我上床睡觉时会发生这种情况,所以我会入睡,错过了睡眠追踪。

2018年8月,我获得了Oura戒指以追踪我的睡眠。 它通过蓝牙连接到iPhone。 充满电且在有效范围内时,本地通知会到达iPhone:

我喜欢此功能,因此我想尝试将其复制到Apple Watch。

想法是在iOS应用中设置阈值(例如80%),并在配对手表的电池电量达到该水平时在iPhone上收到通知。

可能的解决方案#1

iOS上已经有“今日”小部件,可以显示配对的Apple Watch的电池电量,因此似乎已经有些频繁地将数据发送到iPhone:

这让我认为我可以构建一个简单的iOS应用程序,该应用程序要么观察此电池百分比值,要么使用后台任务定期检查该值,并基于对该值的更改发送通知。

在WatchKit中,有WKInterfaceDevice对象,可在iOS和watchOS上使用,其中包含有关已配对手表的信息。

虽然可以使用WKInterfaceDevice.current().batteryLevel在watchOS应用上获取充电百分比,但该属性在iOS端不可用。 看来Today小部件必须使用私有API才能读取配对手表的电池电量。

可能的解决方案2

我探索的下一条途径是让手表定期将其充电百分比发送到配对的iPhone。

我的计划是在watchOS应用程序中安排后台刷新任务( WKApplicationRefreshBackgroundTask ),以使用WatchConnectivity定期将消息发送到watchOS应用程序。

在佩戴Apple Watch时,这些任务似乎每小时至少运行约一次。 手表会将当前的电池电量发送到配对的iPhone,如果电量超过阈值,则会立即向用户显示本地通知。 在许多情况下,当iOS应用使用sendMessage从手表接收消息时,它将在后台启动,而当使用transferUserInfo则不会。

根据我的测试,这些WatchConnectivity消息将通过Internet而不是仅通过蓝牙发送,因此从理论上讲,当手表的充电超出蓝牙范围时,这也将起作用。 在这一点上,电池电量转移到通知部分是非常可靠的,但是后台任务被调用的频率却不是。

通过添加并发症,可以使手表更频繁地报告其百分比。 这可能会导致watchOS更加频繁地为应用程序后台任务分配时间,例如每15分钟左右一次,但这可能会浪费复杂的空间,除非将其用作系统电池电量消耗的替代品。 官方的并发症可能会更频繁地更新,因为它是操作系统的一部分。

不过,所有这些都不相关。 在充电器上时,这些后台刷新任务似乎完全暂停了。 这意味着当手表在充电器上达到或超过指定水平时,此消息传递解决方案无法将通知发送到iPhone。

佩戴手表时的电池电量通知对于管理电量仍然很有用,因为可以设置比系统的10%通知更高的阈值,并在手表电池电量不足时发出警报。 至少在电量很低之前,这至少可以让人们更加警惕,但是并不能解决最初的问题,即不主动检查“今日”小部件或手表本身而知道何时将Apple Watch充电到一定水平。

因此,这个想法现在几乎是死胡同。 我认为这有几种可能的路径:

  • 苹果内置本机电量级别通知(似乎不太可能)
  • Apple更改了WatchKit,以使必要的变量可以在iOS中访问(也许,但是除了我的通知提示,我无法想到其他用于该目的的其他应用程序)

如果后者发生了,也许我会重新考虑一下这个想法。 如果您还有其他解决方案,请在此处查看Stack Overflow帖子。

可能的解决方案#3

如果您已经读了那么多文章,您可能会认为这是对问题不多的过度设计的解决方案。

确保我不戴Apple Watch不会入睡的最简单方法之一(这甚至不是什么大问题),就是戴上充电器并设置约30分钟的计时器

这项探索的全部目的是通过从构思到实施的快速实践,在练习iOS和watchOS开发的同时更好地了解watchOS功能。


查看我针对Apple Watch和iPhone应用程序的应用程序,该应用程序根据您上厕所的频率提醒您喝水:Pee&See