1

升级到 Mavericks 后,我的代码不再成功地将事件添加到日历中。我通过 Mavericks 开发人员发布说明没有找到与此问题相关的特定文档。

你知道如何让这段代码工作吗?

//Send new event to the calendar
NSString          *calEventID;

EKEventStore      *calStore = [[EKEventStore alloc]initWithAccessToEntityTypes:EKEntityTypeEvent];
EKEvent           *calEvent = [EKEvent eventWithEventStore:calStore];


//Calendar Values

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];


calEvent.title     = @"TITLE";
calEvent.startDate = [NSDate date];
calEvent.endDate   = [NSDate date];
calEvent.notes     = @"Here are some notes";


[calEvent setCalendar:[calStore defaultCalendarForNewEvents]];
calEventID = [calEvent eventIdentifier];


 NSError *error = nil;
[calStore saveEvent:calEvent span:EKSpanThisEvent commit:YES error:&error];
[calStore commit:nil];
4

1 回答 1

5

initWithAccessToEntityTypes:在 OS X 10.9 中已弃用,因为 OS X 10.9 引入了类似于 iOS 6 中引入的安全功能。也就是说,在 OS X 10.9 上,您必须先请求使用 EventKit API 的权限,然后才能实际与事件交互。您可以通过使用方法来做到这一点-[EKEventStore requestAccessToEntityType:completion:]

因此,您要使用的代码如下所示:

EKEventStore *eventStore = [[EKEventStore alloc] init];
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        // Event creation code here.
    });
}];

调度到主队列是因为事件存储完成回调可以发生在任意队列上。您可以在此处阅读有关它的文档。

请注意,它-[EKEventStore requestAccessToEntityType:completion:]仅开始在 OS X 10.9 上可用,因此如果您需要支持 10.8,您将需要进行一些版本检查来决定是否需要请求权限。

于 2013-11-01T16:36:14.630 回答