2013-05-03 14 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) { 
相關問題