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 日历项目的主要内容,如果未能解决你的问题,请参考以下文章
iOS EKEvent Store 在循环中重新创建 iCloud 日历,不会保存本地。
无法在 macOS 的 Swift 应用程序中请求日历事件访问(通过 EKEventStore)
iOS:EKEventStore源/ defaultCalendarForNewEvents / calendarsForEntityType在授权后均不返回任何内容