如何使用带有私人数据库的CoreData+CloudKit更新手表复杂度



我的应用程序使用iPhone、手表和iCloud之间同步的数据库。直到最近,我还使用自定义同步代码
特别是,当iPhone上的数据发生变化时,手表的复杂性会通过transferCurrentComplicationUserInfo(_:)进行更新。这或多或少立即更新了复杂性。

新版本的应用程序使用CoreData+CloudKit,iPhone和手表使用私人数据库自动与iCloud同步
例如,如果iPhone更新数据,则会自动上传到iCloud,iCloud会向手表发送无声推送通知,以更新那里的数据
如果我在手表上打开应用程序,则会应用更新,手表会显示新数据。到目前为止还不错。

问题是当应用程序不在手表上运行时,更新复杂度数据
在我的当前版本中,只有当应用程序激活时,复杂情况才会更新。这显然不是复杂的想法,我确信我错过了一些东西。

即使应用程序被终止或在后台,我如何更新复杂情况?

编辑由于Paulw11:的评论

iPhone上的数据更改后,必须尽快更新复杂情况
由于这种情况随时可能发生,因此在手表中安排后台刷新任务并不能解决问题。

简短回答:

可以使用推送类型complication向手表发送推送通知,但目前iCloud无法做到这一点
使用iCloud,必须发送无声推送,并在本地更新复杂情况。

长答案:

watchOS6实现了PushKit框架:

PushKit通知与用户处理的通知不同通知框架。与其显示警报,不如标记您的应用程序的图标,或播放声音,PushKit通知唤醒或启动您的应用程序并给它时间做出响应。

它使用一个PKPushRegistry对象,该对象允许您指定PKPushType和其他complication。Docu:

使用此类型的通知为您的watchOS应用程序的复杂性。watchOS应用程序的复杂性一定是在用户的当前钟面上激活。如果不是,系统会不提供这种类型的推送。对于watchOS 6及更高版本,请发送直接向Apple Watch推送通知。

坏消息:
PushKit需要远程通知服务器。有许多商业服务器允许您使用特定的PKPushType发送推送通知,但iCloud没有。

使用iCloud,以及CoreData+CloudKit镜像,可以将订阅记录存储在生成内部永久查询的相应数据库中。当查询触发时,iCloud会发送一个无声的远程通知。它会唤醒应用程序,有效负载可以让你更新复杂情况
有几种订阅类型可以让iCloud响应特定的更改:CKDatabaseSubscriptionCKRecordZoneSubscriptionCKQuerySubscription
CoreData+CloudKit与专用数据库的镜像使用一个名为com.apple.coredata.cloudkit.zone的特定区域,因此此处可能适合使用CKRecordZoneSubscription,请参阅此处。它还允许您指定一个recordType,以便只有在修改此类型的记录时才会发送推送通知。

编辑:

警告:使用静默远程通知进行更新的可能性很小,而且并非每次推送都可以处理。医生说:

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

当设备收到后台通知时,系统可能会保持并延迟发送通知,这可能会以下副作用:当系统接收到新的背景时通知,它将丢弃旧的通知,只保留最新的。

最新更新