我最近發佈了一個應用程序,並立即發現了一個煩人的錯誤。有一個按鈕可將事件添加到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之後的事件創建。可悲的是我已經用盡了設備來測試它,但是如果我找到一個,我會更新,如果這工作。
而且我要補充一點,因爲複製我已經跑出設備的誤差上測試應用程序的難度,並不能檢查錯誤來自[eventStore saveEvent:event span:EKSpanThisEvent錯誤:&err]; – 2013-05-03 22:23:02