Невозможно создать локальный EKCalendar (Напоминания), если в iCloud отключено напоминание.
Попадание к очень странной проблеме, которая, как мне кажется, связана с API EventKit, и я просто хочу проверить, что я ничего не делаю.
Тестовый пример 1:
- Напоминания включены в конфиденциальности для приложения
- На устройстве есть учетная запись iCloud, но она не синхронизирует напоминания
- Я могу создать локальный список напоминаний в приложении "Напоминания" от Apple
- ПРОБЛЕМА - Попытка создать новый календарь типа сущности EKEntityTypeReminder с источником типа EKSourceTypeLocal завершается неудачей
Контрольный пример 2:
- Напоминания включены в конфиденциальности для приложения
- Устройство не имеет учетной записи iCloud
- Я могу создать локальный список напоминаний в приложении "Напоминания" от Apple
- Я могу создать локальный список напоминаний через EK API
Тестовый пример 3:
- Напоминания включены в конфиденциальности для приложения
- Устройство имеет учетную запись iCloud и настроено на синхронизацию напоминаний.
- Я могу создать список напоминаний iCloud в приложении "Напоминания" от Apple
- Я могу создать список напоминаний 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]);
1 ответ
Если у вас все еще есть проблемы, проверьте EKSourceType
что вы используете, если он существует в вашем телефоне. Для Swift попробуйте использовать EKSourceType.Exchange
, Обратите внимание, что у меня есть учетная запись Outlook/Exchange, синхронизированная с моим телефоном.
Я знаю, что это очень расплывчато, но когда я использовал EKSourceType.Exchange
, это сработало для меня. (Играть с этим)