web-dev-qa-db-fra.com

Ajouter par programme un événement personnalisé au calendrier iPhone

Est-il possible d'ajouter l'événement iCal au calendrier iPhone à partir de l'application personnalisée?

177
Vadim

Basé sur Documentation Apple , cela a un peu changé depuis iOS 6.0.

1) Vous devez demander l'accès au calendrier de l'utilisateur via "requestAccessToEntityType: completion:" et exécuter la gestion des événements dans un bloc.

2) Vous devez valider votre événement maintenant ou passer le paramètre "commit" à votre appel de sauvegarde/suppression.

Tout le reste demeure inchangé...

Ajoutez le framework EventKit et #import <EventKit/EventKit.h> à votre code.

Dans mon exemple, j'ai une propriété d'instance NSString * savedEventId.

Pour ajouter un événement:

    EKEventStore *store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent *event = [EKEvent eventWithEventStore:store];
        event.title = @"Event Title";
        event.startDate = [NSDate date]; //today
        event.endDate = [event.startDate dateByAddingTimeInterval:60*60];  //set 1 hour meeting
        event.calendar = [store defaultCalendarForNewEvents];
        NSError *err = nil;
        [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
        self.savedEventId = event.eventIdentifier;  //save the event id if you want to access this later
    }];

Supprimer l'événement:

    EKEventStore* store = [EKEventStore new];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (!granted) { return; }
        EKEvent* eventToRemove = [store eventWithIdentifier:self.savedEventId];
        if (eventToRemove) {
            NSError* error = nil;
            [store removeEvent:eventToRemove span:EKSpanThisEvent commit:YES error:&error];
        }
    }];

Cela ajoute des événements à votre calendrier par défaut. Si vous avez plusieurs calendriers, vous devez trouver celui qui est

Version rapide

Vous devez importer le framework EventKit

import EventKit

Ajouter un évènement

let store = EKEventStore()
store.requestAccessToEntityType(.Event) {(granted, error) in
    if !granted { return }
    var event = EKEvent(eventStore: store)
    event.title = "Event Title"
    event.startDate = NSDate() //today
    event.endDate = event.startDate.dateByAddingTimeInterval(60*60) //1 hour long meeting
    event.calendar = store.defaultCalendarForNewEvents
    do {
        try store.saveEvent(event, span: .ThisEvent, commit: true)
        self.savedEventId = event.eventIdentifier //save event id to access this particular event later
    } catch {
        // Display error to user
    }
}

Supprimer l'événement

let store = EKEventStore()
store.requestAccessToEntityType(EKEntityTypeEvent) {(granted, error) in
    if !granted { return }
    let eventToRemove = store.eventWithIdentifier(self.savedEventId)
    if eventToRemove != nil {
        do {
            try store.removeEvent(eventToRemove, span: .ThisEvent, commit: true)
        } catch {
            // Display error to user
        }
    }
}
161
William T.

Vous pouvez le faire en utilisant le framework Event Kit sous OS 4.0.

Cliquez avec le bouton droit sur le groupe FrameWorks dans le navigateur de groupes et de fichiers à gauche de la fenêtre. Sélectionnez "Ajouter" puis "FrameWorks existant" puis "EventKit.Framework". 

Ensuite, vous devriez pouvoir ajouter des événements avec un code comme celui-ci:

#import "EventTestViewController.h"
#import <EventKit/EventKit.h>

@implementation EventTestViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    EKEventStore *eventStore = [[EKEventStore alloc] init];

    EKEvent *event  = [EKEvent eventWithEventStore:eventStore];
    event.title     = @"EVENT TITLE";

    event.startDate = [[NSDate alloc] init];
    event.endDate   = [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];

    [event setCalendar:[eventStore defaultCalendarForNewEvents]];
    NSError *err;
    [eventStore saveEvent:event span:EKSpanThisEvent error:&err];       
}

@end
154
WoodenKitty

Oui, il n'y a toujours pas d'API pour cela (2.1). Mais il semblait que chez WWDC beaucoup de gens étaient déjà intéressés par la fonctionnalité (y compris par moi-même) et la recommandation était d'aller sur le site ci-dessous et de créer une demande de fonctionnalité pour cela. S'ils sont suffisamment intéressés, ils pourraient éventuellement transférer le cadre ICal.fr vers le SDK public.

https://developer.Apple.com/bugreporter/

13
keremk

L'accès au calendrier est ajouté à iPhone OS 4.0 :

Accès au calendrier
Les applications peuvent désormais créer et modifier des événements directement dans le fichier Application de calendrier avec kit d'événement.
Créez des événements récurrents, configurez le début et la fin fois et les assigner à n’importe quel calendrier sur l'appareil.

12
Chris S

Vous pouvez ajouter l'événement à l'aide de l'API d'événement, comme décrit par Tristan, et vous pouvez également ajouter un événement Google Agenda qui apparaît dans l'agenda iOS.

utilisation de Client Objective-C de l'API Google

  - (void)addAnEvent {
  // Make a new event, and show it to the user to edit
  GTLCalendarEvent *newEvent = [GTLCalendarEvent object];
  newEvent.summary = @"Sample Added Event";
  newEvent.descriptionProperty = @"Description of sample added event";

  // We'll set the start time to now, and the end time to an hour from now,
  // with a reminder 10 minutes before
  NSDate *anHourFromNow = [NSDate dateWithTimeIntervalSinceNow:60*60];
  GTLDateTime *startDateTime = [GTLDateTime dateTimeWithDate:[NSDate date]
                                                    timeZone:[NSTimeZone systemTimeZone]];
  GTLDateTime *endDateTime = [GTLDateTime dateTimeWithDate:anHourFromNow
                                                  timeZone:[NSTimeZone systemTimeZone]];

  newEvent.start = [GTLCalendarEventDateTime object];
  newEvent.start.dateTime = startDateTime;

  newEvent.end = [GTLCalendarEventDateTime object];
  newEvent.end.dateTime = endDateTime;

  GTLCalendarEventReminder *reminder = [GTLCalendarEventReminder object];
  reminder.minutes = [NSNumber numberWithInteger:10];
  reminder.method = @"email";

  newEvent.reminders = [GTLCalendarEventReminders object];
  newEvent.reminders.overrides = [NSArray arrayWithObject:reminder];
  newEvent.reminders.useDefault = [NSNumber numberWithBool:NO];

  // Display the event edit dialog
  EditEventWindowController *controller = [[[EditEventWindowController alloc] init] autorelease];
  [controller runModalForWindow:[self window]
                          event:newEvent
              completionHandler:^(NSInteger returnCode, GTLCalendarEvent *event) {
                // Callback
                if (returnCode == NSOKButton) {
                  [self addEvent:event];
                }
              }];
}
5
Iggy

Mise à jour pour Swift 4 pour Dashrath answer

import UIKit
import EventKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let eventStore = EKEventStore()

        eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in

            if (granted) && (error == nil) {


                let event = EKEvent(eventStore: eventStore)

                event.title = "My Event"
                event.startDate = Date(timeIntervalSinceNow: TimeInterval())
                event.endDate = Date(timeIntervalSinceNow: TimeInterval())
                event.notes = "Yeah!!!"
                event.calendar = eventStore.defaultCalendarForNewEvents

                var event_id = ""
                do{
                    try eventStore.save(event, span: .thisEvent)
                    event_id = event.eventIdentifier
                }
                catch let error as NSError {
                    print("json error: \(error.localizedDescription)")
                }

                if(event_id != ""){
                    print("event added !")
                }
            }
        })
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

n'oubliez pas également d'ajouter une permission pour l'utilisation du calendrier  image for privary setting

4
luhuiya

Implémentation de Swift 4.0:

utiliser import en haut de la page par import EventKit

puis 

@IBAction func addtoCalendarClicked(sender: AnyObject) {

    let eventStore = EKEventStore()

    eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in

        if (granted) && (error == nil) {
            print("granted \(granted)")
            print("error \(error)")

            let event = EKEvent(eventStore: eventStore)

            event.title = "Event Title"
            event.startDate = Date()
            event.endDate = Date()
            event.notes = "Event Details Here"
            event.calendar = eventStore.defaultCalendarForNewEvents

            var event_id = ""
            do {
                try eventStore.save(event, span: .thisEvent)
                event_id = event.eventIdentifier
            }
            catch let error as NSError {
                print("json error: \(error.localizedDescription)")
            }

            if(event_id != ""){
                print("event added !")
            }
        }
    })
}
4
Dashrath

N'oubliez pas de définir endDate sur l'événement créé, il est obligatoire. 

Sinon, il échouera (presque silencieusement) avec cette erreur: 

"Error Domain=EKErrorDomain Code=3 "No end date has been set." UserInfo={NSLocalizedDescription=No end date has been set.}"

Le code de travail complet pour moi est: 

EKEventStore *store = [EKEventStore new];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    if (!granted) { return; }
    EKEvent *calendarEvent = [EKEvent eventWithEventStore:store];
    calendarEvent.title = [NSString stringWithFormat:@"CEmprendedor: %@", _event.name];
    calendarEvent.startDate = _event.date;
    // 5 hours of duration, we must add the duration of the event to the API
    NSDate *endDate = [_event.date dateByAddingTimeInterval:60*60*5];
    calendarEvent.endDate = endDate;
    calendarEvent.calendar = [store defaultCalendarForNewEvents];
    NSError *err = nil;
    [store saveEvent:calendarEvent span:EKSpanThisEvent commit:YES error:&err];
    self.savedEventId = calendarEvent.eventIdentifier;  //saving the calendar event id to possibly deleted them
}];
1
halbano

Simple .... utilisez la bibliothèque tapku .... vous pouvez google que Word et l'utiliser ... son source ouverte ... profitez-en ... plus besoin de bugger avec ces codes ...

1
Rajesh_Bangalore

L'idée de Google est une bonne idée, mais a des problèmes.

Je peux ouvrir un écran d’agenda Google avec succès, mais uniquement sur la version principale du bureau et ne s’affiche pas correctement sur iPhone Safari. Le calendrier Google Mobile, qui s'affiche correctement sur Safari, ne semble pas fonctionner avec l'API pour ajouter des événements.

Pour le moment, je ne vois pas comment sortir de celui-ci.

0
xgretsch

Code de travail dans Swift-4.2

import UIKit
import EventKit
import EventKitUI

class yourViewController: UIViewController{

    let eventStore = EKEventStore()

    func addEventToCalendar() {

    eventStore.requestAccess( to: EKEntityType.event, completion:{(granted, error) in
        DispatchQueue.main.async {
            if (granted) && (error == nil) {
                let event = EKEvent(eventStore: self.eventStore)
                event.title = self.headerDescription
                event.startDate = self.parse(self.requestDetails.value(forKey: "session_time") as? String ?? "")
                event.endDate = self.parse(self.requestDetails.value(forKey: "session_end_time") as? String ?? "")
                let eventController = EKEventEditViewController()
                eventController.event = event
                eventController.eventStore = self.eventStore
                eventController.editViewDelegate = self
                self.present(eventController, animated: true, completion: nil)

            }
        }


       })
    }

}

Maintenant, nous allons obtenir l'écran de l'événement et vous pouvez également modifier ici vos paramètres:

 enter image description here

Maintenant, ajoutez une méthode de délégué pour gérer Annuler et ajoutez l'action du bouton d'événement de l'écran d'événement:

    extension viewController: EKEventEditViewDelegate {

    func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
        controller.dismiss(animated: true, completion: nil)

    }
}

Remarque: N'oubliez pas d'ajouter la clé NSCalendarsUsageDescription dans la liste d'informations.

0
Alok