修改EKParticipants(参加者)在EventKit像日出

我的目标是将一些被邀请者添加到EKEvent 。 我已经研究过这样的其他问题,比如这个问题 ,但是都表示,以编程方式将EKParticipant添加到EKParticipant本质上是不可能的。 我确实看到attendees属性是只读的,但是我看到其他服务,如Sunrise在移动应用程序中使用它。

我相信他们正在使用一些至less部分与EventKit集成的系统,因为他们从用户的iCal应用程序中获取日历。 例如,从添加的Exchange帐户发送的邀请也由Exchange服务明确发送,而不是由Sunrise自己的邀请(将事件直接发送到Exchange或将其发布到iCal)。

任何解决方法这个限制将是非常有益的 – 也许可以调用添加/删除被邀请者的Exchange端点? EventKit内的解决方法? 只要它不是一个私人的苹果API,我会高兴地尝试一下。

谢谢!

我想到了!

本质上,必须进入从EKParticipantinheritance的EKAttendee类。 我通过使用NSClassFromString()方法创build该类的通用实例。

一旦你有一个与会者,你可以使用setValue:ForKey:函数来设置属性。

最后,将你的EKAttendee实例编译成一个数组,并将其设置为EKEventattendees属性。

我用我的设备上的一个Exchange帐户testing了这个function,它像一个魅力 – 邀请发送和一切!

下面的代码是我现在用来设置事件的参与者。 我的例子是创build新的事件,但是通过在EKEventEKEvent 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:@"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!"); } 

迅雷版rebello95的解决scheme。 我可以确认它就像一个魅力! 我玩弄了firstNamelastName属性,但他们似乎并不重要,所以我把他们排除在我的例子之外。 只有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 }