ios - Modificación de EKParticipants(asistentes) en EventKit como Sunrise
objective-c exchange-server (2)
Mi objetivo es agregar algunos invitados a un EKEvent
. He examinado otras preguntas como esta, como esta , pero todos dicen que es esencialmente imposible agregar EKParticipant
s a un EKEvent
programación. Veo que la propiedad de los attendees
es de solo lectura, pero veo otros servicios como Sunrise usándolo en su aplicación móvil.
Estoy seguro de que están usando algún sistema que se integra, al menos parcialmente, con EventKit porque están incorporando calendarios de la aplicación iCal del usuario. Las invitaciones enviadas desde una cuenta de Exchange adicional, por ejemplo, también son enviadas claramente por el servicio de Exchange en lugar de la propia invitación de Sunrise (resultado de la publicación del evento directamente en Exchange o de la publicación en iCal).
Cualquier solución alternativa a esta restricción sería muy útil. ¿Tal vez un punto final en Exchange al que se pueda llamar para agregar / eliminar invitados? ¿Una solución dentro de EventKit? Siempre y cuando no sea una API de Apple privada, me encantaría probarlo.
¡Gracias!
¡Me lo imaginé!
Esencialmente, uno debe ir a la clase EKAttendee
, que hereda de EKParticipant
. Hice esto creando una instancia genérica de esa clase usando el método NSClassFromString()
.
Una vez que tenga un asistente, puede establecer las propiedades utilizando la función setValue:ForKey:
.
Por último, compile sus instancias de EKAttendee
en una matriz y establezca eso en la EKEvent
de los attendees
EKEvent
.
Probé esto con una cuenta de Exchange en mi dispositivo, y funcionó a la perfección: ¡invitaciones enviadas y todo!
El código a continuación es lo que estoy usando ahora para configurar a los asistentes a los eventos. Mi ejemplo es para crear nuevos eventos, pero esto puede hacerse de manera muy simple para los eventos existentes haciendo una copia de la lista de attendees
en el EKEvent
, luego modificando y volviendo a configurarla.
//Create generic event info
EKEvent *event = [EKEvent eventWithEventStore:database];
event.title = @"TEST EVENT";
event.location = @"Test location";
event.notes = @"Example notes";
event.startDate = [NSDate date];
event.endDate = [[NSDate date] dateByAddingTimeInterval:(60 * 60)];
event.calendar = exchange;
//Do our super clever hack
NSMutableArray *attendees = [NSMutableArray new];
for (int i = 0; i < 5; i++) {
//Initialize a EKAttendee object, which is not accessible and inherits from EKParticipant
Class className = NSClassFromString(@"EKAttendee");
id attendee = [className new];
//Set the properties of this attendee using setValue:forKey:
[attendee setValue:@"Invitee" forKey:@"firstName"];
[attendee setValue:[NSString stringWithFormat:@"#%i", i + 1] forKey:@"lastName"];
[attendee setValue:@"[email protected]" forKey:@"emailAddress"];
//Add this attendee to a list so we can assign it to the event
[attendees addObject:attendee];
}
//Finally, add the invitees to the event
[event setValue:attendees forKey:@"attendees"];
//Save the event!
NSError *error = nil;
[database saveEvent:event span:EKSpanThisEvent error:&error];
if (error) {
NSLog(@"Save failed with error: %@", error);
} else {
NSLog(@"Success!");
}
Versión de la solución de . Puedo confirmar que funciona como un encanto! firstName
con las firstName
y lastName
pero no parecen importar en absoluto, así que las dejé fuera de mi ejemplo. Solo importa la dirección de emailAddress
, que coincide con su lista de contactos para mostrar un nombre completo, por ejemplo, en la aplicación de calendario nativa.
private func createEventWithAttendees() {
let eventStore = EKEventStore()
let calendars = eventStore.calendarsForEntityType(.Event)
let event = EKEvent(eventStore: eventStore)
event.title = "TEST EVENT"
event.startDate = NSDate()
event.endDate = NSDate().dateByAddingTimeInterval(60 * 60)
event.calendar = calendars[0]
var attendees = [EKParticipant]()
for i in 0 ..< 5 {
if let attendee = createParticipant(email: "test/(i)@email.com") {
attendees.append(attendee)
}
}
event.setValue(attendees, forKey: "attendees")
try! eventStore.saveEvent(event, span: .ThisEvent)
}
private func createParticipant(email email: String) -> EKParticipant? {
let clazz: AnyClass? = NSClassFromString("EKAttendee")
if let type = clazz as? NSObject.Type {
let attendee = type.init()
attendee.setValue(email, forKey: "emailAddress")
return attendee as? EKParticipant
}
return nil
}