在 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 应用的情况下使用 cordova 在 Apple Watch 上获取 iPhone 应用的推送通知?