修改EventKit中的EKParticipants(与会者),如Sunrise

时间:2015-06-03 18:16:11

标签: ios objective-c exchange-server eventkit ekevent

我的目标是向EKEvent添加一些被邀请者。我已经查看了其他类似问题,例如this one,但是所有人都说我们无法以编程方式将EKParticipant添加到EKEvent。我确实看到attendees属性是只读的,但我看到其他服务如Sunrise在移动应用中使用它。

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

此限制的任何解决方法都非常有用 - 可能是Exchange上可以调用添加/删除被邀请者的端点? EventKit内部的解决方法?只要它不是私有的Apple API,我就会非常乐意尝试它。

谢谢!

2 个答案:

答案 0 :(得分:13)

我明白了!

基本上,必须进入EKAttendee类,它继承自EKParticipant。我通过使用NSClassFromString()方法创建该类的通用实例来完成此操作。

有了与会者后,您可以使用setValue:ForKey:功能设置属性。

最后,将您的EKAttendee个实例编译成一个数组,并将其设置为EKEvent的{​​{1}}属性。

我在我的设备上使用Exchange帐户进行了测试,它就像一个魅力 - 邀请已发送和所有内容!

以下代码是我现在用来设置事件参与者的代码。我的示例是创建新事件,但这可以通过在attendees上复制attendees列表,然后修改并重新设置它来非常简单地为现有事件完成。

EKEvent

答案 1 :(得分:7)

rebello95解决方案的Swift版本。我可以确认它有点像魅力!我玩过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
}