How to accept/decline EKEvent invitation?

2019-02-13 17:19发布

问题:

I would like to allow my users to accept/decline a meeting invitation within my app.

I think what I need is to update somehow the EKParticipantStatus but it looks like it isn't possible to update.

Apple Docs: Event Kit cannot add participants to an event nor change participant information

In this stackOverflow question someone suggested to bring the native EventKitUI, which I've tried like this:

  class CalendarViewController: UIViewController, EKEventViewDelegate {

        // .....

        let eventController = EKEventViewController()
        guard let eventWithIdentifier = MeetingsFetcher.eventStoreClass.event(withIdentifier: meeting.UUID) else {
            return nil
        }
        eventController.delegate = self
        eventController.event = eventWithIdentifier
        eventController.allowsEditing = true
        eventController.allowsCalendarPreview = true

        let navCon = UINavigationController(rootViewController: eventController)

        // customizing the toolbar where the accept/maybe/decline buttons appear
        navCon.toolbar.isTranslucent = false
        navCon.toolbar.tintColor = .blueGreen
        navCon.toolbar.backgroundColor = .coolWhite10

        // customizing the nav bar where the OK button appears
        navCon.navigationBar.callinAppearence()
        present(navCon, animated: true, completion: nil)

        // .....

        // view gets dismissed, so it does detects the action, but no effect
        func eventViewController(_ controller: EKEventViewController, didCompleteWith action: EKEventViewAction) {
              controller.dismiss(animated: true, completion: nil)
        }

The native UI shows pretty good but the buttons don't make any effect in the native calendar.

Am I missing something or it's just not possible? Why would they allow to interact with those buttons if it's not possible to save anything?

Thank you!

PD: I have these permissions in the info.plist:

  • Privacy - Calendars Usage Description
  • Privacy - Contacts Usage Description
  • Privacy - Reminders Usage Description

UPDATE:

Please note that EKEventEditViewController is not what I am looking for. This screen wouldn't allow me to accept or decline the event, it would only allow me to edit the details.

回答1:

To allow the user to create, edit, or delete events, use the EKEventEditViewDelegate protocol.

let eventController = EKEventViewController()
guard let eventWithIdentifier = MeetingsFetcher.eventStoreClass.event(withIdentifier: meeting.UUID) else {
                return nil
            }
eventController.delegate = self
eventController.event = eventWithIdentifier
eventController.editViewDelegate = self
...

CalendarViewController class must conform to the EKEventEditViewDelegate protocol and must implement the eventEditViewController method to dismiss the modal view controller as shown below:

func eventEditViewController(_ controller: EKEventEditViewController, 
             didCompleteWith action: EKEventEditViewAction) {

    switch (action) {
        case EKEventEditViewActionCanceled:
        case EKEventEditViewActionSaved:
        ...
    }

}