iCal仅在全新安装时添加事件错误,并通过重新启动修复

时间:2013-05-03 22:02:30

标签: ios cocoa icalendar eventkit ekevent

我最近发布了一个应用程序,并立即发现一个恼人的错误。有一个按钮可以向iCal添加事件。按下时,系统会要求用户允许应用程序访问日历。如果用户单击“确定”,则会显示错误消息(代码中的if(!saved))。但是,如果用户然后重新启动应用程序,则一切正常(即项目已添加到iCal而无需请求权限)。

这个错误特别令人烦恼的是它没有出现在模拟器中,或者在以前安装过应用程序的任何设备中(包括删除应用程序和重置隐私设置后)。这使得难以复制。

- (IBAction)addToCal:(id)sender{

EKEventStore *eventStore = self.filmController.eventStore;
/* I have moved this code to a new method, called after access is requested. See the edit...    
EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
event.title     = self.film.title;
event.startDate = self.show.date;
event.endDate   = [[NSDate alloc] initWithTimeInterval:(60*[self.film.length integerValue]) sinceDate:event.startDate];
event.location = @"Cinema";
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
*/
if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]){
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if(granted) {
            BOOL saved = [self saveEventToEventStore:eventStore];

            NSString *msg;
            NSString *title;

            if(!saved) {
                title = @"Sorry: We can't access your calendar";
                msg = @"Please check your access settings for the app in Settings>>Privacy>>Calendars (and try turning permissions 'Off' then 'On'). If you still can't save events then please let us know.";
            }
            else {
                title = @"Added";
                msg = @"Item added to calendar";
            }
            UIAlertView *eventAlert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
            [eventAlert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];

        }
        else {
            UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Sorry: We can't access your calendar" message:@"You must change the setting for the app in Settings>>Privacy>>Calendars." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
            [errorAlert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
        }
    }];
}
else {
    [self saveEventToEventStore:eventStore];
}
}

-(BOOL) saveEventToEventStore:(EKEventStore *)eventStore {

//Set event details
EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
event.title     = self.film.title;
event.startDate = self.show.date;
event.endDate   = [[NSDate alloc] initWithTimeInterval:(60*[self.film.length integerValue]) sinceDate:event.startDate];
event.location = @"Cinema";
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
//event details end

NSError *err;
return [eventStore saveEvent:event span:EKSpanThisEvent error:&err];
}

任何帮助都将非常感谢....

尼克

编辑:我一直在考虑这个问题,但问题仍然不明显。我唯一的猜测是我在requestAccess之前设置了我的事件详细信息。这可能会引发一些错误(可能在设置日历时),这会导致保存失败。重新启动应用程序会从已授予访问权限的状态启动它,从而避免错误。我仍然对这个猜测并不完全满意,因为我认为它只会在第一次按下'添加到iCal'按钮时出现问题,而我的问题会在后续按下时发生。

我在上面添加了新的(更完整的)代码,它将事件创建放在requestAccess之后。可悲的是,我已经用尽了设备来测试它,但是如果我找到一个,我会更新,如果这有效。

1 个答案:

答案 0 :(得分:0)

所以最后设法测试我上面的编辑,它的工作原理。所以我认为问题在于调用

[event setCalendar:[eventStore defaultCalendarForNewEvents]];

之前

[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {