上次更新时的EKEvent

时间:2015-09-22 14:00:11

标签: xcode calendar ekevent ekeventkit

我目前正在构建一个iOS日历应用程序,可以访问iphone的日历来读取/写入它,我面临的问题是我的应用程序应该同步我的应用程序的日历和iphone日历,所以如果我的应用修改了一个事件,它应该在iphone的日历中被修改,反之亦然。

类EKEvent的对象似乎没有updatedAt属性,所以我没有办法说出哪一个是给定事件的最新版本,是我的应用程序还是iPhone的日历之一。

上次修改ekevent时有没有办法获得?

提前感谢。

1 个答案:

答案 0 :(得分:2)

好的,我告诉你我所知道的一切,我希望能提供帮助。

您是对的,没有最后修改日期作为单个 EKEvent 的属性。只有 EKCalendarItem 有一个属性lastModifiedDate,但我不确定它在您的情况下是否有用。

我发现了这个有趣的功能:

#pragma mark - Calendar Changed
- (void)calendarChanged:(NSNotification *)notification {
    EKEventStore *ekEventStore = notification.object;

    NSDate *now = [NSDate date];
    NSDateComponents *offsetComponents = [NSDateComponents new];
    [offsetComponents setDay:0];
    [offsetComponents setMonth:4];
    [offsetComponents setYear:0];
    NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:offsetComponents toDate:now options:0];

    NSArray *ekEventStoreChangedObjectIDArray = [notification.userInfo objectForKey:@"EKEventStoreChangedObjectIDsUserInfoKey"];
    NSPredicate *predicate = [ekEventStore    predicateForEventsWithStartDate:now
                                                                  endDate:endDate
                                                                calendars:nil];
    // Loop through all events in range
    [ekEventStore enumerateEventsMatchingPredicate:predicate usingBlock:^(EKEvent *ekEvent, BOOL *stop) {
        // Check this event against each ekObjectID in notification
        [ekEventStoreChangedObjectIDArray enumerateObjectsUsingBlock:^(NSString *ekEventStoreChangedObjectID, NSUInteger idx, BOOL *stop) {
            NSObject *ekObjectID = [(NSManagedObject *)ekEvent objectID];
            if ([ekEventStoreChangedObjectID isEqual:ekObjectID]) {
                // Log the event we found and stop (each event should only exist once in store)
                NSLog(@"calendarChanged(): Event Changed: title:%@", ekEvent.title);
                *stop = YES;
            }
        }];
    }];
}

最初发布了in this answer,但似乎使用私有API。

最后,请注意在EKEvent的属性eventIdentifier中:

  

如果事件的日历发生变化,则最有可能发生其标识符   也发生了变化。

也许这些信息可能会有所帮助,请参阅the Apple Documentation