Невозможно создать календарь напоминаний в iOS
Я пытаюсь создать календарь напоминаний, чтобы добавлять и удалять напоминания. Он действительно хорошо работает на устройствах, которые я использую (iPhone 5/4S/4), но на некоторых клиентских устройствах, которые по-прежнему остаются на iPhone. Я получаю эту ошибку ниже об учетной записи, не поддерживающей напоминания.
Вот рабочий процесс:
* Init the event store.
* Request permission (check its granted for Reminder types) (iOS6+) for lower we just init.
* Create a new calendar, local storage, type = Reminder
* Save calendar to get its Identifier.
Работает большую часть времени, это появляется на некоторых устройствах -
Error Domain=EKErrorDomain Code=24 "That account does not support reminders."
Разрешения предоставляются и проверяются в разделе "Настройки", "Конфиденциальность", "Напоминания". Я не могу найти ничего в документах об условиях, при которых вы получите эту ошибку.
Спасибо!
Ответы
Ответ 1
Не уверен, что вам все еще нужно это, но вот что я столкнулся.
Прежде всего, я уверен, что напоминания не могут быть установлены в календаре с локальным источником. Я продолжал получать "Эта учетная запись не поддерживает напоминания". Даже после установки всех свойств без чтения в календаре, прежде чем переходить к хранилищу событий, он все равно не работает. Источником должен быть calDav. Затем я попробовал ответ Devfly, и это не сработало, но по другой причине. Он продолжал получать мой календарь gmail, который не позволяет устанавливать напоминания (я думаю, что он действительно читается только для событий и напоминаний). Поэтому я использовал следующий код, чтобы получить фактический источник iCloud
for (EKSource *source in sources) {
NSLog(@"source %@",source.title);
if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"]) {
localSource = source;
break;
}
}
Эта настройка этого источника в моем новом календаре напоминаний работала для меня. надеюсь, что это поможет кому-то
Ответ 2
Во-первых, просто проверка: вы создаете "новый календарь" (целый календарь), а не просто "новое напоминание", правильно?
Вторые: вы используете iOS6? Напоминания доступны (в EventKit) только начиная с iOS6: ссылка
Как прокомментировал Джесси Русак, это происходит потому, что вы, вероятно, создаете новый календарь внутри учетной записи/источника, который не поддерживает напоминания.
Как создать новый календарь?
Вы устанавливаете свойство source?
Первое, что вы можете попробовать, - это закодировать все источники, пока не найдете подходящий.
EKSourceTypeLocal поддерживает напоминания. iCal тоже.
Здесь список EKSourceType
typedef enum {
EKSourceTypeLocal,
EKSourceTypeExchange,
EKSourceTypeCalDAV,
EKSourceTypeMobileMe,
EKSourceTypeSubscribed,
EKSourceTypeBirthdays
} EKSourceType;
Найдите подходящий вариант:
// find local source for example
EKSource *localSource = nil;
for (EKSource *source in store.sources)
{
if (source.sourceType == EKSourceTypeLocal) // or another source type that supports
{
localSource = source;
break;
}
}
Затем создайте новый календарь, установив правильный источник
EKCalendar *cal;
if (identifier == nil)
{
cal = [EKCalendar calendarForEntityType:EKEntityTypeReminder eventStore:store];
cal.title = @"Demo calendar";
cal.source = localSource;
[store saveCalendar:cal commit:YES error:nil];
}
Попробуйте и дайте мне знать
Ответ 3
То, что решило мою проблему, заключается не в сохранении календаря в локальном источнике, а в EKSourceTypeCalDAV
(iCloud). Он работает, и он синхронизируется на всех устройствах.
Ответ 4
Локальный магазин может не поддерживать напоминания. Это воспроизводится, если включен iCloud.
Это самое надежное решение, которое я смог найти, без жесткого кодирования любых предположений:
let calendar = EKCalendar(forEntityType: .Reminder, eventStore: eventStore)
if eventStore.sources.count == 0 { // reproducible after Reset Content and Settings
calendar.source = EKSource()
}
else {
calendar.source = eventStore.defaultCalendarForNewReminders().source
}
eventStore.saveCalendar(calendar, commit: true)