Используя Swift, как мне добавить новое событие в ранее созданный календарь? - PullRequest
0 голосов
/ 20 апреля 2020

Я создал функцию в swift, которая проверяет все календари, сохраненные на устройстве iOS, а затем создает новую, если календарь с указанным заголовком c «TESTCAL» (в данном случае) не не существует.

func checkCal(){
    print("checkCal")
    let calendars = eventStore.calendars(for: EKEntityType.event) as [EKCalendar]
    var exists = false

    for calendar in calendars {
        if calendar.title == "TESTCAL"{
            exists = true

            print("FOUND CAL: TESTCAL")
            print(calendar.title)
            print(calendar.calendarIdentifier)
            self.calIdent = calendar.calendarIdentifier

        } else{
            print("NO CAL: ", calendar.title)
        }
    }
    if exists == false {
        let newCal = EKCalendar(for: EKEntityType.event, eventStore: eventStore)
        newCal.title = "TESTCAL"
        newCal.source = eventStore.defaultCalendarForNewEvents?.source
        _ = try? eventStore.saveCalendar(newCal, commit: true)
        print("CAL CREATED: ", newCal.title)
        print("With Ident: ", newCal.calendarIdentifier)
        self.calIdent = newCal.calendarIdentifier
    }

    addToCal()
}

Затем, когда я приду, чтобы добавить событие позже, следующим образом

    func addToCal()
{
let eventVC = EKEventEditViewController()
eventVC.editViewDelegate = self
eventVC.eventStore = EKEventStore()

let date = self.passedDate
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yy"
let dateForCal = dateFormatter.date(from: date)

let event = EKEvent(eventStore: eventVC.eventStore)
event.title =  self.passedTitle
event.notes = self.passedDetail
event.startDate = dateForCal
event.endDate = dateForCal
event.isAllDay = true
event.url = URL(string: passedWebLink) }

Событие будет добавлено в календарь iOS по умолчанию.

Я попытался добавить следующий код в функцию addCal ():

event.calendar = eventStore.calendar(withIdentifier: self.calIdent)

и

let calendars = eventStore.calendars(for: EKEntityType.event) as [EKCalendar]

for calendar in calendars {
    if calendar.title == "TESTCAL"{
        event.calendar = calendar
        print("YES")

    } else{
        print("NO")
    }
}

Оба эти сообщения дают мне сообщение об ошибке в AppDelegate и вызывают Cra sh:

[EventKit] Error getting shared calendar invitaions for entity types 3 from daemon: Error Domain=EKCADErrorDomain Code 1014 "(null)

Есть идеи?

1 Ответ

1 голос
/ 20 апреля 2020

Я вижу больше возможных причин проблемы, с которой вы столкнулись:

  1. Календарь TESTCAL не был успешно создан. Вы можете проверить создание календаря, уловив возможную ошибку, возникающую при сохранении календаря:

        do {
           try eventStore.saveCalendar(newCal, commit: true)
        } catch {
            print(error)
        }
    
  2. Как происходит сохранение события, неясно из опубликованного вами кода.

    Если вы представляете экземпляр EKEventEditViewController для пользователя, чтобы завершить создание события, вам не хватает установки события на контроллере представления в методе addToCal:

    eventV C .event = event

    Если вы хотите сохранить событие напрямую, вам не нужно использовать EKEventEditViewController, а вместо этого вызвать save для eventStore:

    do {
       try eventStore.save(event, span: .thisEvent)
    } catch {
        print(error)
    }  
    
  3. Для общие календари, дополнительный ключ конфиденциальности для доступа к контактам необходим в файле .plist вашей цели, а именно NSContactsUsageDescription. Без этого ключа доступ к общим календарям приводит к взлому sh.

С учетом всего вышеперечисленного, проверенного / обслуженного, ваше решение по настройке календаря на мероприятии должно работать:

event.calendar = eventStore.calendar(withIdentifier: self.calIdent)

Кроме того, убедитесь, что у вас есть вместо кода для запроса доступа к хранилищу набора событий от пользователя перед любой манипуляцией с календарем / событием. Для получения дополнительной информации о запросе доступа, проверьте https://developer.apple.com/documentation/eventkit/ekeventstore/1507547-requestaccess

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...