在 Apple Watch 上接收来自 iCloud 的推送通知

Posted

技术标签:

【中文标题】在 Apple Watch 上接收来自 iCloud 的推送通知【英文标题】:Receiving push notifications from iCloud on Apple Watch 【发布时间】:2020-05-26 15:14:59 【问题描述】:

我有一个同时支持 ios 和 watchOS 的应用。它们对存储在 iCloud 中的数据进行操作。我想做的是当 iCloud 服务器上的数据发生变化时在 Apple Watch 上接收通知,以便我可以更新并发症。

我正在尝试使用扩展委托中的applicationDidFinishLaunching 中的CKQuerySubscription 设置订阅。我也在WKExtension上打电话给registerForRemoteNotifications

容器和记录类型正确,我的谓词是TRUEPREDICATE 我在私有数据库上操作 订阅保存过程(即database.save(subscription))成功 远程通知注册过程成功(调用didRegisterForRemoteNotifications) 我在实际设备上运行,并且有断点确认一切设置正常,结果什么都没有出现 手表扩展设置了远程通知后台模式和推送通知功能 当我在手表上启动实际应用时,通过常规查询可以正常查询数据

问题是:

didReceiveRemoteNotification 永远不会被调用

是否真的可以从 iCloud 获得推送通知,还是我应该放弃这个想法?

【问题讨论】:

您在解决这个问题上取得了进展吗?我遇到了同样的问题,并重新观看了有关该主题的 WWDC 2019 视频 (developer.apple.com/videos/play/wwdc2019/208),以确保我没有遗漏任何内容,但没有运气。我正在尝试像你一样使用didRegisterForRemoteNotifications,尽管对于无声内容推送通知来说这不应该是必需的。 在之前的评论之后,我得到了它的工作,但它似乎不一致。而且我不知道如何为 CloudKit 通知提供并发症更新优先级。 经过进一步调查,watchOS 应用程序似乎在前台收到推送通知。我仍在测试以查看是否曾在后台收到它们(例如在下一次后台刷新时)。我希望有一种方法可以使用 PushKit 并以某种方式让 CloudKit 使用PKPushType.complication 发送通知,但似乎无法将 PushKit 与 CloudKit 一起使用,并且只能与您自己的服务器一起使用。 @gohnjanotis 我得出了相同的结论,即它仅在应用程序处于前台时才处于活动状态。目前,我正在使用 CloudKit 容器获取我在手表应用程序中显示的数据,但我也在使用 WatchConnectivity 从手机应用程序更新复杂功能。 在 developer.apple.com/forums/thread/126286 中查看 ppix 的答案 【参考方案1】:

问题可能如下: watchOS 确实会处理静默推送通知,但很少会发生推送,并且推送可能会被丢弃。 The docs说:

系统将后台通知视为低优先级:您可以 使用它们来刷新您的应用程序的内容,但系统不会 保证他们的交货。此外,系统可能会限制 如果总数变为 过多的。允许的后台通知数量 系统取决于当前条件,但不要尝试发送超过 每小时两三个。

当设备收到后台通知时,系统可能会暂停 并延迟通知的传递,这可能会导致 以下副作用:当系统收到新背景时 通知,它丢弃旧的通知,只保留 最新的。

所以 iCloud 推送并不适合更新复杂功能。

如果不使用 iCloud 而是使用单独的服务器,则可以使用 PushKit 来更新并发症。我觉得奇怪的是,Apple 没有为 iCloud 实现这个(还没有?)。 另见我的问答here。

【讨论】:

【参考方案2】:

我的情况与@whistler 完全相同。 一切正常,为了在 watchOS 上接收远程通知,除了:didReceiveRemoteNotification

但我发现,通过请求对用户通知的授权有助于更频繁地发送它们,但仍然没有发送所有通知,但至少更频繁地发送(而且似乎仍然只是在前台)。

简单地请求用户通知的授权:

try? await UNUserNotificationCenter.current().requestAuthorization(options: [.alert])

这似乎不会在 watchOS 上提示用户警报。

【讨论】:

以上是关于在 Apple Watch 上接收来自 iCloud 的推送通知的主要内容,如果未能解决你的问题,请参考以下文章

来自 Apple Watch 的 iOS 实时心率统计数据

来自 Apple Watch 的 iOS 实时心率统计数据

如何在没有 Apple Watch 应用的情况下使用 cordova 在 Apple Watch 上获取 iPhone 应用的推送通知?

在 Apple Watch 上使用代理服务器?

在 Apple Watch 上获取 RSSI

如何在独立的 Apple Watch 应用中配置推送通知