将 EventKit 事件与远程数据库同步

Posted

技术标签:

【中文标题】将 EventKit 事件与远程数据库同步【英文标题】:Sync EventKit events with remote database 【发布时间】:2016-05-31 17:57:52 【问题描述】:

我想创建一个应用程序,从远程数据库中检索事件(类似于日历事件)并在视图中显示它们,创建、编辑和删除新的或现有的事件;目前我正在使用 EventKit 框架来访问 ios 日历,我阅读了这个文档并尝试了 SimpleEKDemo: https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009765

我实际上可以通过带有 JSON 响应的 HTTP POST 请求(NSMutableURLRequest)从服务器获取事件,并在 tableView 中显示它们,当我点击一个事件时,我可以编辑它,更新远程数据库条目,如果我切换到 iOS 日历我看到了事件(所以写入日历数据库是成功的);

最重要的是所有事件都必须与远程数据库同步,所以当用户离开我的应用程序,打开 iOS 日历并编辑以前通过我的应用程序创建的事件时,就会出现核心问题:在这种情况下不会发生同步并且数据不一致。

我在想这些可能的方法:

有没有办法挂钩 iOS 日历,以便我可以在远程数据库中执行更新,仅针对事件的子集? 或者我可以创建一个只能通过我的应用编辑的活动吗? 也许我必须退出 EventKit 并使用自定义更新功能创建自定义日历?

我还阅读了这些问题:Create a calendar in iOS How to identify EKEvent uniquely with Sync across the devicesSync database on ipad with remote database 但我不知道我是否走在正确的轨道上。

感谢您的帮助,谢谢。

编辑:“同步”是指应用数据库上的所有数据必须与服务器数据库相同

【问题讨论】:

【参考方案1】:

至少今天您无法为 iOS 日历创建自定义协议提供程序,我认为这就是您所要求的(您想使用类似 JSON 的协议或某些应用程序扩展来提供日历后端) .

共有三个选项:

a) 使用应用程序保持远程数据库同步

b) 编写自己的日历 UI

c) 在服务器端或代理中实现 CalDAV

听起来 a) 就是你今天正在做的事情。当您的应用程序启动时,您需要同步 EventKit 数据库(以获取在其他 EventKit 应用程序(如日历)中完成的更改)。显然,用户需要不时启动您的应用程序才能进行同步......(作为黑客,您也可以使用推送来触发您的应用程序)

根据您的需要 b) 需要大量工作,而且您的平台集成为零。

我认为在您的服务器中实现 CalDAV,或者添加一个在服务器的 JSON 和 CalDAV 之间进行转换的代理可能是最好的方法。然后,您可以将您的服务器作为 CalDAV 帐户添加到 iOS。作为奖励,您可以使用任何其他客户端在您的服务器上执行 CalDAV ...

【讨论】:

也许另一种解决方案是根据上次修改日期检查更改?我不确定是否可以获取此字段,但如果可以,我可以将服务器数据库上的事件日期与应用程序数据库的事件日期进行比较并更新最旧的字段;每次用户启动应用程序时都可能发生此检查... 当然,您可以选择使用哪些字段来检测更改。我可能会在相关字段上使用散列,或者进行完整比较。我认为您的问题是当您的应用未运行时没有发生同步。 “我认为你的问题是当你的应用没有运行时没有同步发生。” - 确切地说,主要问题发生在应用程序未运行时,用户打开 iOS 日历并编辑以前在自定义应用程序中创建的事件,我不会在后台始终同步以不消耗太多电池;我根本没想到最后修改日期字段。我不知道 CalDAV,谢谢你提到它。

以上是关于将 EventKit 事件与远程数据库同步的主要内容,如果未能解决你的问题,请参考以下文章

EventKit 同步问题

iOS - 无法使用 EventKit 将日历事件添加到 Gmail 日历

rsync 远程同

使用 EventKit 添加事件和日历

如何在 EventKit 中使用 CalendarIdentifier 获取提醒?

EK EventKit 的内存管理和性能