EKEventStore 不会按外部或本地标识符返回 Exchange 日历项目

Posted

技术标签:

【中文标题】EKEventStore 不会按外部或本地标识符返回 Exchange 日历项目【英文标题】:EKEventStore will not return Exchange Calendar items by external or local identifier 【发布时间】:2018-04-11 21:05:00 【问题描述】:

我正在使用 EKEventStore API 使用以下方法将事件保存到默认日历:

EKEventStore - saveEvent:span:commit:error:.

事件保存后,我将 externalID 和 localID 存储在我的数据库中,以供将来参考:

externalID = [myEvent calendarItemExternalIdentifier];和 localID = [myEvent eventIdentifier]。

我遇到的问题是,当我回去尝试使用以下内容检索事件时:

[[eventStore calendarItemsWithExternalIdentifier:externalID] firstObject]

[eventStore eventWithIdentifier:localID],

ios 无法找到我的活动。

如果我运行完全相同的代码,但将我的默认日历设置为 iCloud 日历,那么一切正常。

但如果默认日历是 Exchange 日历,我会收到以下错误消息:

“获取带有 UUID 的日历项目时出错 [在此处插入 externalID]:错误域 = EKCADErrorDomain Code=1010 "(null)"”

有人遇到过这个问题吗?

我已经部署此代码 2 年多了,用户最近报告说他们无法打开在 Exchange 日历上创建的约会。不知道发生了什么变化或什么时候发生的变化,但我已经在 iOS 10 和 11 上对此进行了测试,两者都有问题。

任何见解将不胜感激, 真挚地, ~阿拉什

【问题讨论】:

嗨,最近从 iOS 12 开始,我面临这个问题。 Outlook 事件同步到 iOS 11 但从 iOS 12 开始,事件存储不会返回 Exchange 事件。你发现问题了吗? 嘿 GvSharma,请在下面查看我的答案。这就是我们能够解决该问题的方法。如果您有任何问题,请告诉我!另外,请注意,如果您依靠“EKEventStoreChangedNotification”通知来更新有关日历的任何内部数据,我们最近有一些用户的设备出现了问题。他们基本上每 2 秒从 iOS 收到通知! :( 【参考方案1】:

很遗憾,我们能够通过在事件注释中包含内部参考 ID 来解决此问题。然后,如果 externalEventID 和 eventID 都未能返回事件,这是我们在 Exchange 中的问题,那么我们会回退到使用 EKEventSearchCallback 中的开始和结束日期来查找我们的事件。

基本上,它最终看起来像这样:

EKEventSearchCallback searchBlock = ^(EKEvent *event, BOOL *stop)

    if([MyCustomClass event:event
 notesMatchesKnownValueDict:knownValueDict])
    
        foundEvent = event;
        *stop = YES;
    
;

NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:startDate
                                                             endDate:endDate
                                                           calendars:nil];

[eventStore enumerateEventsMatchingPredicate:predicate usingBlock:searchBlock];

【讨论】:

【参考方案2】:

另一种解决方案可能是等待事件与 Exchange 同步。例如,我保存事件并跟踪分配给它的 ID。每隔几秒循环检查一次是否有变化。当更改发生时,它位于交换服务器上,您最好在数据库中引用它。

试试看,如果有效,请告诉我!

【讨论】:

以上是关于EKEventStore 不会按外部或本地标识符返回 Exchange 日历项目的主要内容,如果未能解决你的问题,请参考以下文章

星型模式 - 外部标识符事实或维度?

应用程序关闭时如何在 EKEventStore 中检测?

iOS EKEvent Store 在循环中重新创建 iCloud 日历,不会保存本地。

无法在 macOS 的 Swift 应用程序中请求日历事件访问(通过 EKEventStore)

iOS:EKEventStore源/ defaultCalendarForNewEvents / calendarsForEntityType在授权后均不返回任何内容

例外:oauth 状态丢失或无效。 (ASP.NET Core 外部标识符 OAuth)