Невозможно создать календарь напоминаний в 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)