Изменение участников EK (участников) в EventKit, например, Sunrise
Моя цель - добавить приглашенных к EKEvent
. Я рассмотрел другие вопросы, такие как этот, но все говорят, что по существу невозможно добавить EKParticipant
в EKEvent
программно. Я вижу, что свойство attendees
доступно только для чтения, но я вижу другие службы, такие как Sunrise, используя его в своем мобильном приложении.
Я уверен, что они используют некоторую систему, которая по крайней мере частично интегрируется с EventKit, потому что они вытаскивают календари из приложения iCal пользователя. Например, приглашения, отправленные с добавленной учетной записи Exchange, также явно отправляются службой Exchange, в отличие от приглашения Sunrise (результат либо отправки события прямо в Exchange, либо для его отправки в iCal).
Любое обходное решение это ограничение было бы очень полезно - возможно, конечная точка на Exchange, которую можно вызвать для добавления/удаления приглашенных? Обходной путь внутри EventKit? Пока это не частный API Apple, я был бы более чем счастлив попробовать.
Спасибо!
Ответы
Ответ 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 на объект участника?