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

reb*_*o95 20 exchange-server objective-c ios eventkit ekevent

我的目标是添加一些被邀请者EKEvent.我已经研究过像这样的其他问题,比如这个问题,但是所有人都说EKParticipantEKEvent编程方式添加s 基本上是不可能的.我确实看到该attendees属性是只读的,但我看到其他服务,如Sunrise在他们的移动应用程序中使用它.

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

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

谢谢!

reb*_*o95 13

我想到了!

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

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

最后,将EKAttendee实例编译为数组,并将其设置为EKEvents 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:@"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!");
}
Run Code Online (Sandbox Code Playgroud)

  • 我用过上面的.但我对iCal日历的误差低于此值.保存失败并显示错误:错误Domain = EKErrorDomain Code = 31"无法更改与会者"UserInfo = 0x7f85a06d5880 {NSLocalizedDescription =无法更改与会者}如何继续?有人帮我这个. (3认同)

Tom*_*ren 7

Swift版本的rebello95的解决方案.我可以确认它有点像魅力!我玩了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
}
Run Code Online (Sandbox Code Playgroud)