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

Изменение участников EK (участников) в EventKit, например, Sunrise

Моя цель - добавить приглашенных к EKEvent. Я рассмотрел другие вопросы, такие как этот, но все говорят, что по существу невозможно добавить EKParticipant в EKEvent программно. Я вижу, что свойство attendees доступно только для чтения, но я вижу другие службы, такие как Sunrise, используя его в своем мобильном приложении.

Я уверен, что они используют некоторую систему, которая по крайней мере частично интегрируется с EventKit, потому что они вытаскивают календари из приложения iCal пользователя. Например, приглашения, отправленные с добавленной учетной записи Exchange, также явно отправляются службой Exchange, в отличие от приглашения Sunrise (результат либо отправки события прямо в Exchange, либо для его отправки в iCal).

Любое обходное решение это ограничение было бы очень полезно - возможно, конечная точка на Exchange, которую можно вызвать для добавления/удаления приглашенных? Обходной путь внутри EventKit? Пока это не частный API Apple, я был бы более чем счастлив попробовать.

Спасибо!

4b9b3361

Ответ 1

Я понял это!

По существу, нужно перейти в класс EKAttendee, который наследуется от EKParticipant. Я сделал это, создав общий экземпляр этого класса с помощью метода NSClassFromString().

После того, как у вас есть участник, вы можете установить свойства с помощью функции setValue:ForKey:.

Наконец, скомпилируйте экземпляры EKAttendee в массив и установите это свойство EKEvent attendees.

Я проверил это с учетной записью Exchange на своем устройстве, и он работал как шарм - приглашение отправлено и все!

Ниже приведен код, который я использую для установки участников событий. Мой пример - для создания новых событий, но это можно сделать очень просто для существующих событий, сделав копию списка attendees на EKEvent, а затем изменив его и переустановив.

//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!");
}

Ответ 2

Быстрая версия rebello95. Я могу подтвердить, что это работает как шарм! Я играл со свойствами firstName и lastName, но они, похоже, не имеют никакого значения, поэтому я оставил их из своего примера. Учитывается только значение emailAddress, которое сопоставляется с вашим списком контактов, чтобы отобразить полное имя, например, в собственном приложении календаря.

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
}

Ответ 3

Ответ Тома сработал для меня, я могу добавить посетителей, но проблема в том, что UUID EKAttendee равен нулю, поэтому участники не отображаются в iCal. Как мы можем добавить этот UUID на объект участника?