WatchKit静默通知/订阅CloudKit记录更改/一般发布者订阅者模式

时间:2018-10-05 23:23:22

标签: ios swift watchkit cloudkit

我有一款策略游戏,当iPhone无法触及但Watch和iPhone确实具有互联网连接时,我希望将其功能扩展到Apple Watch。 (例如,两者都位于不同的wifi网络中)

因为它是一个离线游戏,所以我不能只从Watch向服务器发出httprequests。我遇到过CloudKit,到目前为止,它非常适合我:

iPhone订阅了CloudKit数据库中的CKRecord更改,并且只要用户在Watch上执行操作,Watch就会将命令(例如,将Queen发送到B4)添加到CloudKit Record中。由于iPhone已订阅“记录更改”,因此该命令将得到通知并执行。

现在,因为我不想让用户等待,所以我希望有一种方法让iPhone告诉Watch收到了很好的命令,并且告诉了对方(在本示例中,该机器人会立即回复)也已经轮到他了-因此,系统会提示“手表”下载并显示“更新的”游戏地图。

很遗憾,我无法为Apple Watch找到类似CKQuerySubscription之类的东西。 CKSubscription可用,但仅带有ID属性。我已经找到了构造函数CKRecordZoneNotification(fromRemoteNotificationDictionary: <#T##[AnyHashable : Any]#>),但我认为这仅在实际收到我没有的通知时才有用。因此,目前,我让Watch每分钟下载一次数据以捕获游戏状态(10kb),并相应显示更改。但是,这有两个问题:

  1. 用户不知道iPhone是否实际收到了 说明(也许互联网中断或iPhone电池没电了)

  2. 固定的间隔永远都不好,每60秒要么太慢,以至于无法快速抵御机器人,要么就太快了。 实际的对手需要花费几分钟的时间才能采取行动。然后手表是 尽管没有数据,但刷新时浪费数据和电池 新数据

iPhone可以通过写入另一个已确认记录ID x的记录来解决进一步的问题,但这又需要一分钟的时间才能显示手表。某种静默通知将在几秒钟内完成一次往返。我还考虑过仅查询刚刚提出的“可见状态”-每20秒记录一次,这对于用户来说是可行的,但这会给CloudKit服务器带来沉重的负担,而Apple则以“请求过多”的错误来惩罚。

在我的Android应用中,我没有这个问题。 Google通过自己的服务器转发所有流量,但由于某种原因,懒惰的Apple不想这样做。这就是为什么我现在要花几周时间来做这样的小功能的原因。我很乐意为此提供帮助,因为目前我不知道还能尝试什么。我检查了Firebase,但他们似乎也只提供Watch的REST API,因此我遇到了完全相同的问题。

0 个答案:

没有答案