Как я могу написать в свой EKEventStore?

Раньше я сохранял события календаря в defaultCalendarForNewEvents, это работало. Сегодня он уже не работает, но выдает код ошибки: 6 "Календарь только для чтения".

Права запрашиваются должным образом, прежде чем я попытаюсь изменить календарь. Почему он больше не работает, и почему он работал раньше с тем же кодом?

Примечание. Для проверки я использую эмулятор iPhone XCode.

Код:

func createEvent(eventStore: EKEventStore, title: String, startDate: NSDate, endDate: NSDate) {
    let event = EKEvent(eventStore: eventStore)

    event.title = "Dodgy Codes"
    event.startDate = startDate
    event.endDate = endDate
    event.calendar = eventStore.defaultCalendarForNewEvents

    //Hardcoded testing data
    event.location = "Amsterdam"

    event.notes = "notes notes notes notes"
    do {
        try eventStore.saveEvent(event, span: .ThisEvent)
    } catch let error as NSError {
    //error: Calendar is read only
    print("\(NSStringFromClass(CalendarController)): Adding event: \(error.localizedDescription)")
    }
}

Вывод: Вывод, который я получаю


person Async-    schedule 06.06.2016    source источник


Ответы (2)


я думаю, что это проблема с авторизацией, вам нужно получить разрешение на доступ к календарю, попробуйте так, я надеюсь, что это сработает для вас

func checkForEventAuthorization(eventStore: EKEventStore, completionHandler block:(granted: Bool, error: NSError?) -> Void)  {
    if eventStore.respondsToSelector(Selector("requestAccessToEntityType:completion:")) == true {
        eventStore.requestAccessToEntityType(EKEntityType.Event, completion: { (granted, error) -> Void in
            block(granted: granted, error: error)
        })
    } else {
        block (granted: true, error: nil)
    }
}


    func createEvent(eventStore: EKEventStore, title: String, startDate: NSDate, endDate: NSDate) {
    self.checkForEventAuthorization(eventStore, completionHandler: { (granted, error) -> Void in
        if granted == true {
            let event = EKEvent(eventStore: eventStore)

            event.title = "Dodgy Codes"
            event.startDate = startDate
            event.endDate = endDate
            event.calendar = eventStore.defaultCalendarForNewEvents

            //Hardcoded testing data
            event.location = "Amsterdam"

            event.notes = "notes notes notes notes"
            do {
                try eventStore.saveEvent(event, span: .ThisEvent)
            } catch let error as NSError {
                //error: Calendar is read only
                print("\(NSStringFromClass(CalendarController)): Adding event: \(error.localizedDescription)")
            }
        }
    })
}
person Andey Satyanarayana    schedule 06.06.2016
comment
извините, это не работает, я правильно запросил доступ, прежде чем перейти к этому методу здесь. - person Async-; 06.06.2016
comment
и я добавил этот фрагмент кода, чтобы просто еще раз проверить, предоставлен ли доступ, и я попадаю внутрь предоставленного блока, но после этого, пытаясь сохранить в календаре, выдает ту же ошибку - person Async-; 06.06.2016
comment
затем один раз проверьте настройки iphone. либо у вашего приложения есть разрешения, либо нет, для доступа к календарю - person Andey Satyanarayana; 06.06.2016

Хорошо, кажется, что эта проблема решена, потому что ее изначально не было. Я запутался, запуская его на симуляторе, а не на реальном устройстве. Попытка запустить тот же код на iPhone6 ​​сработала. На симуляторе этого нет! Совет новичкам: симулятор iOS не всегда надежен, после достижения некоторой сложности он становится действительно ненадежным, особенно с проблемами, связанными с такими сервисами, как EKEventStore. Лучше всегда тестируйте его на реальных устройствах, ребята.

person Async-    schedule 06.06.2016
comment
Не совсем решение, когда иногда предпочтительнее использовать эмулятор. - person Declan McKenna; 24.08.2016
comment
Голосование против коллег — вот почему я присоединился к Stack-Overflow. - person Declan McKenna; 26.08.2016