2013-05-03 59 views
0

我最近发布了一个应用程序,并立即发现了一个烦人的错误。有一个按钮可将事件添加到iCal。当被按下时,用户被要求允许应用程序访问日历。如果用户单击确定,则会显示错误消息(代码中的if(!已保存))。但是,如果用户重新启动应用程序,那么一切都可以正常工作(即无需征得许可即可将项目添加到iCal中)。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之后的事件创建。可悲的是我已经用尽了设备来测试它,但是如果我找到一个,我会更新,如果这工作。

+0

而且我要补充一点,因为复制我已经跑出设备的误差上测试应用程序的难度,并不能检查错误来自[eventStore saveEvent:event span:EKSpanThisEvent错误:&err]; – 2013-05-03 22:23:02

回答

0

所以最后设法测试我的编辑上面,它的工作原理。所以我觉得这个问题是调用

[event setCalendar:[eventStore defaultCalendarForNewEvents]]; 

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