puedo - Cómo agregar un evento en el calendario del dispositivo usando swift
eliminar varios eventos google calendar (5)
Debe agregar "Privacidad - Descripción del uso de calendarios" a info.plist. El siguiente código funciona con la última versión de xcode y 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")
}
}
Me interesaría saber cómo agregar un evento de calendario en el dispositivo, pero usar swift. Sé que hay algunos ejemplos hechos en Objective-C, pero en este momento no hay nada rápido. Muchas gracias.
Esto fue muy lento en iOS 11.2 Xcode 9.2, así que modifiqué la respuesta de Luca Davanzo para usar colas (funciona mucho más rápido):
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?)
}
})
}
}
Pude ajustar esto y eliminar el error del compilador mencionado en los comentarios a las respuestas anteriores (y algunas otras), de la siguiente manera:
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")
}
})
Sin embargo, aún obtengo el siguiente error en la parte inferior con respecto a "EKSpan.ThisEvent": Etiqueta de argumento incorrecta en la llamada (tiene '' : span: error:'', expected '' : span: commit:'').
Intenté cambiar "error" por "cometer", pero me dio un error del compilador que decía que esperaba un Bool en lugar de cero. Parece un problema que tiene que ver con las actualizaciones en sintaxis rápida.
Edición: Terminé siguiendo este tutorial y pude hacerlo funcionar.
Primero, solicite permiso para acceder al calendario y (si se otorga ese permiso) llame a una función para agregar el evento.
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) } }
La función que se llama en el fragmento de código anterior para agregar el evento:
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") } }
Swift 3.0 compatible:
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?)
}
})
}
Y también importar EventKit
Así que puedes llamar fácilmente a este método desde cualquier lugar:
addEventToCalendar(title: "Girlfriend birthday", description: "Remember or die!", startDate: NSDate(), endDate: NSDate())
Si lo prefiere, puede poner este método dentro de una clase de utilidad y definirlo como ''estático''.
Versión 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")
}
}
Referencia: https://gist.github.com/mchirico/d072c4e38bda61040f91