与Google日历/ Outlook进行双向同步

时间:2016-06-17 16:29:25

标签: java c# outlook calendar fullcalendar

我在我的应用程序中使用FullCalendar来显示通过我们自己的应用程序创建的事件。

我有一个用于创建/更新事件的添加/编辑表单。这些事件存储在应用程序使用的db中。

我需要更进一步,需要将Google和Outlook日历同步到我的日历中。这应该是2路同步,即

如果我在日历中创建/编辑/更新活动,则应在Google / Outlook日历中创建/编辑/删除该活动。

反之亦然。

如果我在Google / Outlook日历中进行了一些更改,则应该会在我的日历中显示。

我希望你能够实现这个目标:

  1. 我是否应该抓取Google / Outlook的所有事件并将其导入我的数据库,然后在我的日历视图中显示它们。这在技术上是否可行?即将一个频道的整个事件集导入我的数据库。

  2. 我是否应该通过Google / Outlook API进行GET获取特定视图的事件,我现在正在我的日历中(我将有我的日历视图的开始数据和结束日期)并且只是将它们显示给我的日历(即我没有将这些外部事件存储在我的数据库中)。如果用户希望对应通过创建/更新和删除的API调用直接更新到Google / Outlook日历的事件进行任何更改。

  3. 最佳方法应该是什么?

    编辑:

    我去了https://calendar.sunrise.am/(其中一个日历同步网络应用)并注意到了

    enter image description here

    即他们允许将许多不同的应用程序日历/任务同步到他们的日历中。

    看到所有我觉得将所有这些应用程序的所有事件存储到我们自己的应用程序的数据库中是不可行的。如果通过我的应用程序对这些事件进行了任何更改,我应该调用这些应用程序的API来将更改转换为他们的应用程序(Google日历,Outlook等)。

    你的想法是什么?

1 个答案:

答案 0 :(得分:15)

为了能够创建可靠的同步解决方案,您需要做几件事。最重要的是,另一方(本例中的谷歌日历和Outlook)应该与您合作并提供api来执行增量同步。我没有看过Outlook,但Google Calendar api为您提供了所需的一切。

首先回答您的问题 - 是的,您需要获取所有事件(您可能会跳过过去的事件)并将它们存储在您自己的数据库中。始终对所有外部源(加上您自己的数据库)进行查询的速度很慢,使同步变得更加困难并且限制了很多,因为您无法轻松地在多个源上过滤或搜索事件。下面我假设我们只使用Google日历,希望Outlook类似(但我没有检查)。

所以你需要的清单:

  1. 您自己的包含事件的数据库,其中事件表包含几个重要的元数据列:已创建\已更新(上次创建事件的时间或已更新,与事件本身的日期无关) ,Source(此事件来自Google Calendar,Outlook或您自己的应用程序),UpdatedAtSource(上次修改此事件的来源),EventID(事件的唯一标识符 - 在某些情况下具有防止重复的重要事件)。

  2. 最初从目标提供程序获取所有事件并将它们存储在数据库中。 Here是对Google日历活动结构的引用,您会看到所有必需的元数据字段(已创建,更新,ID)都存在于此处。

  3. 现在您需要关注来自提供商的新活动。您可以通过轮询(定期检查是否有新事件)或向您提供提供者推送事件来执行此操作。 Google日历支持这两种选项。 Here是描述如何实施推送通知的链接,here是描述如何仅 新事件的链接,即您(您的应用程序)没有发生的事件。见之前。请注意,您每次都需要获取整个列表,也不需要提供一些过滤选项(例如"给我在2016-06-21之后创建的所有事件&# 34)。所有这一切都是不可靠的,但谷歌日历开发人员知道如何制作良好的同步API,因此他们会为您解决这个问题。只需抓取并存储提供的nextSyncToken并使用它来制作未来的请求。如果您使用推送通知 - 始终也会定期轮询事件,但不经常(例如每隔几个小时一次)。推送通知不是100%可靠,有些可能会错过 - 您需要使用nextSyncToken api来处理推送通知。

  4. 将您自己的应用程序所做的更改推送到目标提供程序。但是,当做出更改时,立即执行此操作。而是使用后台进程逐个推送每个用户+提供程序对的更改。会出现网络故障,会有冲突,因此您必须按顺序推送更改,而不是并行推送(同样,按顺序推送每个用户+提供商对,而不是全局推送)。存储上次成功推送更改的时间戳(同样,对于每个用户+提供商)以及进程是否已中断 - 您知道从哪里开始。
  5. 我不会在这里讨论太多,但你会发生冲突 - 也就是用户在多个来源中修改了相同的事件。但是,如果您使用推送通知 - 冲突将非常罕见。仍然你必须至少在用户界面中为它们做计划。如果您检测到无法解决的冲突 - 暂停同步过程并询问用户如何解决它。
  6. 所以你看到有一些工作要做,但最终你会发出少量请求,并在每次向提供商提出请求时获取少量数据,您的用户将很乐意看到Google提供的新活动您的应用程序中的日历\ Outlook即时(反之亦然)。