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!

20
demandé sur Community 2015-06-03 21:16:11

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!");
}
11
répondu rebello95 2015-06-11 17:43:15

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
}
6
répondu Tom van Zummeren 2017-05-23 12:34:18