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

时间:2017-04-07 12:27:14

标签: ios swift reminders

我正在编写一个使用EKReminder的任务管理应用程序。 在一台iOS设备上使用时效果很好。

当我在两个设备(相同的苹果帐户)上使用时,我意识到提醒更改同步具有显着延迟,甚至经常不完整。 (尝试了iCloud,google,公司展望)

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

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

1 个答案:

答案 0 :(得分:1)

@Losiowaty建议在问题的评论中提供有效的解决方案,但我认为以下解决方案可以提供更多信息。公平地说,我实际上已经注意到了与 Apple 提醒应用程序特别相同的问题,并且认为通常该解决方案适用于iOS但可以延续到相同的在macOS上也有类似问题的通知。

对于iOS,问题似乎是:

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

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

  • iPad和iPhone从Reminders应用程序收到有关12:00 TODO项目的推送通知,时间为12:00。
  • iPad推送通知已执行,标记为已完成,并立即在iPad上清除
  • iPhone推送通知仍然存在(我们试图解决的问题),但在删除之前可能不会删除(打开提醒应用程序而不是推送通知通常不会清除此问题)。

原因是应用程序没有清除推送通知,因此即使它现在是无关信息(因为它在另一台设备上被标记为已完成(或已经延后)后被清除),但推送通知系统不知道(因为推送只是信息的有效载荷,除非你在这些上正确使用TTL,但这是一个不同的答案)。大多数/某些应用程序在某种程度上使用的解决方法可能是:

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

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

看起来无论哪种方式,您都需要某种后台任务处理来处理某些事情(通过通知服务扩展as linked或通过Apple支持的简单background task)。

我希望这能回答你的问题并指出你正在建设的正确方向!