Подтвердить что ты не робот

Как добавить событие в календарь устройства с помощью быстрого

Мне было бы интересно узнать, как добавить событие календаря в устройство, но с помощью swift. Я знаю, что есть несколько примеров, сделанных в Objective-C, но на данный момент ничего не происходит быстро. Большое спасибо.

4b9b3361

Ответ 1

версия Swift 3.0

    let eventStore : EKEventStore = EKEventStore()

    // 'EKEntityTypeReminder' or 'EKEntityTypeEvent'

    eventStore.requestAccess(to: .event) { (granted, error) in

        if (granted) && (error == nil) {
            print("granted \(granted)")
            print("error \(error)")

            let event:EKEvent = EKEvent(eventStore: eventStore)

            event.title = "Test Title"
            event.startDate = Date()
            event.endDate = Date()
            event.notes = "This is a note"
            event.calendar = eventStore.defaultCalendarForNewEvents
            do {
                try eventStore.save(event, span: .thisEvent)
            } catch let error as NSError {
                print("failed to save event with error : \(error)")
            }
            print("Saved Event")
        }
        else{

            print("failed to save event with error : \(error) or access not granted")
        }
    }   

Ссылка: https://gist.github.com/mchirico/d072c4e38bda61040f91

Ответ 2

Совместимость с Swift 3.0:

func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) {
    let eventStore = EKEventStore()

    eventStore.requestAccess(to: .event, completion: { (granted, error) in
        if (granted) && (error == nil) {
            let event = EKEvent(eventStore: eventStore)
            event.title = title
            event.startDate = startDate
            event.endDate = endDate
            event.notes = description
            event.calendar = eventStore.defaultCalendarForNewEvents
            do {
                try eventStore.save(event, span: .thisEvent)
            } catch let e as NSError {
                completion?(false, e)
                return
            }
            completion?(true, nil)
        } else {
            completion?(false, error as NSError?)
        }
    })
}

А также импортировать EventKit

Таким образом, вы можете легко вызвать этот метод везде:

addEventToCalendar(title: "Girlfriend birthday", description: "Remember or die!", startDate: NSDate(), endDate: NSDate())

Если вы предпочитаете, вы можете поместить этот метод в класс utiliy и определить его как "статический".

Ответ 3

Вам нужно добавить "info - Календари использования использования" в info.plist. Следующий код работает с последней версией xcode и swift 3.

import EventKit
class EventHelper
{
    let appleEventStore = EKEventStore()
    var calendars: [EKCalendar]?
    func generateEvent() {
        let status = EKEventStore.authorizationStatus(for: EKEntityType.event)

        switch (status)
        {
        case EKAuthorizationStatus.notDetermined:
            // This happens on first-run
            requestAccessToCalendar()
        case EKAuthorizationStatus.authorized:
            // User has access
            print("User has access to calendar")
            self.addAppleEvents()
        case EKAuthorizationStatus.restricted, EKAuthorizationStatus.denied:
            // We need to help them give us permission
            noPermission()
        }
    }
    func noPermission()
    {
        print("User has to change settings...goto settings to view access")
    }
    func requestAccessToCalendar() {
        appleEventStore.requestAccess(to: .event, completion: { (granted, error) in
            if (granted) && (error == nil) {
                DispatchQueue.main.async {
                    print("User has access to calendar")
                    self.addAppleEvents()
                }
            } else {
                DispatchQueue.main.async{
                    self.noPermission()
                }
            }
        })
    }
    func addAppleEvents()
    {
        let event:EKEvent = EKEvent(eventStore: appleEventStore)
        event.title = "Test Event"
        event.startDate = NSDate() as Date
        event.endDate = NSDate() as Date
        event.notes = "This is a note"
        event.calendar = appleEventStore.defaultCalendarForNewEvents

        do {
            try appleEventStore.save(event, span: .thisEvent)
            print("events added with dates:")
        } catch let e as NSError {
            print(e.description)
            return
        }   
        print("Saved Event")
    }
}

Ответ 4

Мне удалось настроить это и устранить ошибку компилятора, упомянутую в комментариях к вышеприведенным ответам (и нескольким другим), следующим образом:

 var eventStore : EKEventStore = EKEventStore()

    // 'EKEntityTypeReminder' or 'EKEntityTypeEvent'

    eventStore.requestAccessToEntityType(EKEntityType.Event, completion: {
        (granted, error) in

        if (granted) && (error == nil) {
            print("granted \(granted)")
            print("error \(error)")

            var event:EKEvent = EKEvent(eventStore: eventStore)

            event.title = "Test Title"
            event.startDate = NSDate()
            event.endDate = NSDate()
            event.notes = "This is a note"
            event.calendar = eventStore.defaultCalendarForNewEvents

            eventStore.saveEvent(event, span: EKSpan.ThisEvent, error: nil)

            print("Saved Event")
        } 
    })

Тем не менее, я все еще получаю следующую ошибку внизу "EKSpan.ThisEvent": неправильная метка аргумента в вызове (есть ": span: error:", expected ": span: commit: ').

Я попробовал изменить "ошибку" на "commit", но это дало мне ошибку компилятора, в которой говорилось, что он ожидает Bool вместо nil. Кажется, что проблема связана с обновлениями в быстром синтаксисе.

Изменить: я закончил с этот учебник и смог заставить его работать.

  • Сначала попросите разрешения на доступ к календарю и (если это разрешение предоставлено) вызовите функцию для добавления события.

    var savedEventId : String = ""
    
    func requestAccessPermission() {
        let eventStore = EKEventStore()
    
        let startDate = NSDate()
        let endDate = startDate.dateByAddingTimeInterval(60 * 60) // Ends one hour later
    
        if (EKEventStore.authorizationStatusForEntityType(.Event) != EKAuthorizationStatus.Authorized) {
            eventStore.requestAccessToEntityType(.Event, completion: {
            granted, error in
                self.createEvent(eventStore, title: "Test Title", startDate: startDate, endDate: endDate)
            })
        } else {
            createEvent(eventStore, title: "Test Title", startDate: startDate, endDate: endDate)
        }
    }
    
  • Функция, вызываемая в приведенном выше фрагменте кода для добавления события:

    func createEvent(eventStore: EKEventStore, title: String, startDate: NSDate, endDate: NSDate) {
        let event = EKEvent(eventStore: eventStore)
        event.title = title
        event.startDate = startDate
        event.endDate = endDate
        event.calendar = eventStore.defaultCalendarForNewEvents
        do {
            try eventStore.saveEvent(event, span: .ThisEvent)
            savedEventId = event.eventIdentifier
        } catch {
            print("Error Saving")
        }
    }
    

Ответ 5

Это было очень медленным в iOS 11.2 Xcode 9.2, поэтому я изменил Luca Davanzo на использование очередей (работает намного быстрее):

func addEventToCalendar(title: String, description: String?, startDate: Date, endDate: Date, completion: ((_ success: Bool, _ error: NSError?) -> Void)? = nil) {
        DispatchQueue.global(qos: .background).async { () -> Void in
            let eventStore = EKEventStore()

            eventStore.requestAccess(to: .event, completion: { (granted, error) in
                if (granted) && (error == nil) {
                    let event = EKEvent(eventStore: eventStore)
                    event.title = title
                    event.startDate = startDate
                    event.endDate = endDate
                    event.notes = description
                    event.calendar = eventStore.defaultCalendarForNewEvents
                    do {
                        try eventStore.save(event, span: .thisEvent)
                    } catch let e as NSError {
                        completion?(false, e)
                        return
                    }
                    completion?(true, nil)
                } else {
                    completion?(false, error as NSError?)
                }
            })
        }
    }