Modification de EKParticipants (participants) dans le cadre D'EventKit comme Sunrise
Mon but est d'ajouter quelques invités pour un EKEvent
. J'ai regardé dans d'autres questions, telles que celui-ci , mais tous disent qu'il est essentiellement impossible d'ajouter EKParticipant
s EKEvent
par programmation. Je vois que la propriété attendees
est en lecture seule, mais je vois d'autres services comme Sunrise l'utiliser dans leur application mobile.
je suis sûr qu'ils utilisent un système qui au moins s'intègre partiellement avec EventKit car ils tirent les calendriers de l'application iCal de l'utilisateur. Les invitations envoyées à partir d'un compte Exchange supplémentaire, par exemple, sont également clairement envoyées par le service Exchange par opposition à L'invitation de Sunrise (résultat de l'envoi de L'événement directement à Exchange ou à l'envoi de L'événement à iCal).
toute solution à cette restriction serait très utile - peut-être un point final sur L'échange qui peut être appelé à Ajouter/Supprimer des invités? Une solution de contournement à l'intérieur de EventKit? Tant que ce n'est pas une Pomme d'API, je serais plus qu'heureux de l'essayer.
Merci!
2 réponses
j'ai compris!
essentiellement, il faut entrer dans la classe EKAttendee
, qui hérite de EKParticipant
. J'ai fait cela en créant une instance générique de cette classe en utilisant la méthode NSClassFromString()
.
une fois que vous avez un participant, vous pouvez définir les propriétés en utilisant la fonction setValue:ForKey:
.
enfin, compilez vos instances EKAttendee
dans un tableau, et positionnez cela sur le EKEvent
's attendees
propriété.
j'ai testé cela avec un compte D'échange sur mon appareil, et ça a fonctionné comme un charme-invitation envoyé et tout!
le code ci-dessous est ce que j'utilise maintenant pour définir les participants des événements. Mon exemple est pour créer de nouveaux événements, mais cela peut être fait très simplement pour des événements existants en faisant une copie de la liste attendees
sur le EKEvent
, puis en la modifiant et en la réinitialisant.
//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:@"test@email.com" 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!");
}
version Swift de rebello95 ' s solution. Je peux confirmer que ça marche comme un charme! J'ai joué avec les propriétés firstName
et lastName
mais elles ne semblent pas avoir d'importance du tout, donc je les ai laissées en dehors de mon exemple. Seul le emailAddress
compte, qui est comparé à votre liste de contacts pour afficher un nom complet Dans par exemple l'application native calendar.
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
}