如何以编程方式触发/强制同步 IOS 个提醒?

How can a sync of IOS reminders programmatically be triggered / forced?

我正在编写一个使用 EKReminder 的任务管理应用程序。 在一台 iOS 设备上使用时完美运行。

当我在两个设备(同一个苹果账户)上使用时,我发现提醒更改同步有很大的延迟,甚至经常不完整。 (试过 iCloud,google,公司前景)

这似乎与我的应用程序无关(如果我直接在 Reminder iOS 应用程序中更改提醒,也会发生同样的情况)。

我能否以编程方式强制将提醒与链接到的任何服务(例如 iCloud)同步,并从我的应用程序中触发?

@Losiowaty 在问题的评论中提出了一个有效的解决方案,但我认为以下解决方案可以提供更多信息。公平地说,我实际上已经注意到这个完全相同的问题,特别是 Apple Reminders 应用程序,并且认为通常解决方案适用于 iOS 但可以转移到在 macOS 上也有类似问题的相同通知。

对于 iOS,问题似乎是:

  • 同一个 Apple iCloud 帐户上的两台 iOS 设备都将收到特定的 提醒 推送通知。但问题是,在目前几乎所有情况下,清除一台设备上的推送通知并不能正确同步第二台设备。根据我的理解,这是上面提出的问题。

据我所知,第二个不是公认的问题是这个问题是由于 "host" 应用程序没有正确清除它自己的推送通知,可以这么说。我的意思是:

  • iPad 和 iPhone 在 12:00.
  • 从提醒应用程序接收关于 12:00 待办事项的推送通知
  • iPad 推送通知已被执行,标记为已完成,并立即在 iPad 被清除
  • iPhone 推送通知仍然存在(我们正在尝试解决的问题),但可能不会被删除,直到它自己被删除(打开提醒应用程序而不是从推送通知中通常不会清除此问题).

原因是推送通知没有被应用程序清除,所以即使它现在是不相关的信息(因为它在另一台设备上被标记为完成(或延后)后被清除),但是推送通知系统不知道这一点(因为推送只是信息的有效负载,除非您在这些信息上正确使用 TTL,但这是不同的答案)。 most/some 应用程序在一定程度上使用的解决方法可能是:

1) 如评论中所述,在要点 2 中,操作(标记为已完成,并从设备 1 中清除)可以更新后端(在本例中为 iCloud)此 item 完成,然后向所有相关设备发送静默推送,正确清除推送通知(这可能以应用程序后台任务的形式发生,类似于 Notification Service Extension Apple link here (iOS 10+ only)

2) 另一种方法是为您发送的每个推送通知(在所有相关设备上)保留一个唯一的内部 "secret" 密钥。然后,您可以将任何一个 "task" 对象(以 Reminders 应用程序上下文为例,但这实际上可以是您应用程序中保存的任何数据对象)与一组推送相关联通知 "secret" 键(如果您觉得这些键失控,它们可能会在自定义计时器上过期,特别是因为推送可能会 已查看不相关 在大多数情况下 30 天后)。由此,以及使应用程序更新其数据的机制,如果应用程序注意到设备有任何它不应该的推送通知(基于与 "active" 关联的 "secret" 键集数据),它应该为您清除它们。这最终得到与方法 1 相同的结果,但不需要静默推送(可以使用套接字,或完全使用其他东西),并且可以依赖基本的 background job

看起来无论哪种方式,您都需要某种后台任务处理来在发生某些事情时采取行动(通过 Apple 支持的通知服务扩展 as linked or through a simple background task)。

我希望这能回答您的问题并为您指明正确的方向!