2013-10-17 49 views
3

在這裏遇到一個很奇怪的問題,這在我看來是EventKit API的問題,我只是想檢查它沒有我在做什麼。無法創建本地EKCalendar(提醒)如果iCloud設置爲不同步提醒

測試案例1:

  • 提醒在隱私啓用應用程序
  • 該器件有一個iCloud帳戶,但它的設置不同步提醒
  • 我可以創建一個本地提醒列表中的提醒
  • ISSUE - 試圖創建EKSourceTypeLocal類型的實體類型EKEntityTypeReminder的新日曆失敗

測試案例2:

  • 提醒在隱私啓用應用程序
  • 設備沒有iCloud帳戶
  • 我可以從「提醒」應用程序創建一個本地提醒列表蘋果
  • 我可以通過EK API

維護設備創建一個本地提醒列表t情況3:

  • 提醒在隱私啓用應用程序
  • 該器件有一個iCloud帳戶,並設置爲同步提醒
  • 我可以在「提醒」創建的iCloud提醒列表從蘋果
  • 應用程序,我可以創造一個iCloud中通過EK API

我要去催名單瘋了還是這是與API的錯誤嗎?

乾杯!

下面的代碼:

EKCalendar *remindersList = nil; 
NSString *remindersListIdent = [[NSUserDefaults standardUserDefaults] objectForKey:kReminderListIdentDefaultsKey]; 

if(remindersListIdent) { 
    remindersList = [store calendarWithIdentifier:remindersListIdent]; 

    if(remindersList) { 
     // has valid reminders list so save reminder and return (don't run rest of function) 
     [self saveReminder:reminder toCalendar:remindersList withTypeLabel:reminderTypeLabel]; 
     return; 
    } 
} 

NSArray *currentCalendars = [store calendarsForEntityType:EKEntityTypeReminder]; 
for(EKCalendar *cal in currentCalendars) { 
    if([[cal title] isEqualToString:@"My App Name"]) { 
     remindersList = cal; 

     [[NSUserDefaults standardUserDefaults] setObject:[remindersList calendarIdentifier] forKey:kReminderListIdentDefaultsKey]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
     [self saveReminder:reminder toCalendar:remindersList withTypeLabel:reminderTypeLabel]; 
     return; 
    } 
} 

EKSource *localSource = nil; 
for (EKSource *source in store.sources) { 
    if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"]) { 
     localSource = source; 
     break; 
    } 
} 
if(localSource) { 
    remindersList = [self newCalendarListInSource:localSource]; 
} 

if(!remindersList) { 
    for (EKSource *source in store.sources) { 
     if (source.sourceType == EKSourceTypeLocal) { 
      localSource = source; 
      remindersList = [self newCalendarListInSource:localSource]; 
      if(remindersList) { 
       break; 
      } 
     } 
    } 
} 

if(!remindersList) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // show error message 
    }); 
} 
else { 
    [[NSUserDefaults standardUserDefaults] setObject:[remindersList calendarIdentifier] forKey:kReminderListIdentDefaultsKey]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self saveReminder:reminder toCalendar:remindersList withTypeLabel:reminderTypeLabel]; 
} 

這是newCalendarListInSource的內容:

EKCalendar *remindersList; 

remindersList = [EKCalendar calendarForEntityType:EKEntityTypeReminder eventStore:store]; 
remindersList.source = localSource; 
[remindersList setTitle:@"My App Name"]; 
NSError *listCreateError = nil; 
[store saveCalendar:remindersList commit:YES error:&listCreateError]; 

if(!listCreateError) { 
    return remindersList; 
} 
else { 
    NSLog(@"Failed to create reminders list with error: %@", [listCreateError localizedDescription]); 
+0

我有同樣的瘋狂行爲。找不到任何合理的解釋。到目前爲止你有進步嗎? – Oleksandr

+0

感謝您指出這一點。這是非常嚴重的文件記錄,我很樂意找到一個適用於所有情況的解決方案 – Martin

+0

看起來iOS 9已經修復了這個問題?至少,如果啓用了iCloud但禁用了iCloud提醒,我可以創建本地日曆。 – Steven

回答

-1

對於所有仍然有這樣的問題,請檢查您的EKSourceType如果它存在,你用你的電話。對於Swift,請嘗試使用EKSourceType.Exchange。請注意,我有一個Outlook/Exchange帳戶同步到我的手機。

我知道這非常含糊,但是當我使用EKSourceType.Exchange時,它對我很有用。 (玩吧)