Créer un calendrier personnalisé

Salut, 


 


Je veut créer un calendrier perso dans le cadre de mon appli


J'ai donc fait ça, mais quand je vais dans le calendrier iOS, le calendrier n'est pas crée. J'ai pourtant bien l'identifier qui s'affiche dans mes logs ;)

 



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

EKSource *theSource = nil;
for (EKSource *source in eventStore.sources) {
if (source.sourceType == EKSourceTypeLocal) {
theSource = source;
break;
}
}

NSString *identifier;

EKCalendar *cal;
if (identifier == nil)
{
cal = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:eventStore];
cal.title = @MyCustomCalendar;
cal.source = theSource;
[eventStore saveCalendar:cal commit:YES error:nil];
NSLog(@cal id = %@", cal.calendarIdentifier);
}
else
{
cal = [eventStore calendarWithIdentifier:identifier];
}

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur

    Y a pas une histoire d'autorisation ?


  • L'autorisation est activée, la preuve c'est qu'il m'ajoute les éléments dans mon calendrier par défaut ;)


  • AliGatorAliGator Membre, Modérateur
    - Dans ton code tu as la ligne suivante :
    [eventStore saveCalendar:cal commit:YES error:nil];
    Malheureusement tu as passé "nil" au paramètre "error", ce qui faut que tu n'as pas l'occasion de récupérer la potentielle erreur qui intervient, et ainsi de mieux comprendre ce qui se passe.
    - De plus, d'après la doc, la méthode "saveCalendar:commit:error:" retourne justement un booléen YES/NO pour t'indiquer si la création a réussi ou non.


    Je t'invite donc à  modifier ton code ainsi, ce qui ne va pas forcément corriger ton problème, mais va te permettre d'une part de prévoir le cas d'erreur dans ton code, mais également pour le coup de pouvoir afficher l'erreur retournée et ainsi comprendre ce qui fait qu'il ne crée pas ton calendrier :

    ...
    NSError* error = nil;
    if ([eventStore saveCalendar:cal commit:YES error:&error])
    {
    // la méthode a retourné YES, la création a donc bien réussi
    // ... reste du code
    }
    else
    {
    // La méthode a retourné NO, la création a donc échoué, et
    // la variable 'error' contient en sortie l'erreur décrivant le problème
    NSLog(@Error while creating the calendar: %@", error);
    }
  • Salut AliGator,


     


    Merci pour l'optimisation du code.


     


    Dans le 1er cas si la création a réussi je retourne l'id du calendrier, et dans le 2e cas le message d'erreur.


     


    Au moment d'exécuter mon code, j'ai bien l'id de mon calendrier donc la création a bien réussi et pourtant il n'est pas dans ma liste des différents calendrier de l'appareil.


     


    L'un de vous a t-il une piste s'il vous plait ?


  • Chose bizarre, cela à  l'air de marcher sur le simulateur, mais ça ne marche pas sur mon téléphone.


     


    J'avoue ne pas comprendre encore plus, pourquoi ça marche sur un device et pas sur un autre


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2014 modifié #7


    Y a pas une histoire d'autorisation ?



    Jean, tu n'as pas encore répondu au chat ?
  • Si si je lui ai répondu,


     


    Il y a bien une autorisation et elle a été activée.


     


    En effet dans les réglages il y a bien le switch sur ON sur Calendriers et sur Données cellulaires ;)


  • Joanna CarterJoanna Carter Membre, Modérateur
    Mais ton code montre que tu as n'a pas traité l'authorisation là .


    Vois l'article http://www.raywenderlich.com/64513/cookbook-making-calendar-reminder
  • Ah bon ? A quel niveau tu vois ça ?


     


    Et pourquoi j'aurais l'autorisation sur le simu et pas sur le téléphone ?


  • Joanna CarterJoanna Carter Membre, Modérateur
    Car, sur le simulateur, on a les autorisations de l'utilisateur actuel sur l'ordinateur mais sur le téléphone, c'est pas automatique.
  • Mais sur le téléphone dans les réglages c'est bel et bien mis sur l'interrupteur ON, la preuve c'est qu'il m'ajoute les évenements dans mon calendrier, mais il ne me crée pas de calendrier perso


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2014 modifié #13

    J'ai trouvé ce petit projet et tous va bien sur mon iPad :


     


    https://gist.github.com/martinsik/5115383


     


    Mais, il ça provoque un warning dans le console.


     


    Voici ma version du code dans une méthode de test :



    {
    if (self.eventStore == nil)
    {
    self.eventStore = [[EKEventStore alloc] init];
    }

    // request permissions
    [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
    {
    if (granted)
    {
    EKCalendar *calendar = nil;

    NSString *calendarIdentifier = [[NSUserDefaults standardUserDefaults] valueForKey:@my_calendar_identifier];

    // when identifier exists, my calendar probably already exists
    // note that user can delete my calendar. In that case I have to create it again.
    if (calendarIdentifier)
    {
    NSArray *calendars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent];

    for (EKCalendar * aCal in calendars)
    {
    if([aCal.calendarIdentifier isEqualToString:calendarIdentifier])
    {
    calendar = aCal;

    break;
    }
    }
    }

    // calendar doesn't exist, create it and save it's identifier
    if (!calendar)
    {
    calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore];

    // set calendar name. This is what users will see in their Calendar app
    [calendar setTitle:@Make a Date];

    for (EKSource *s in self.eventStore.sources)
    {
    if (s.sourceType == EKSourceTypeLocal)
    {
    calendar.source = s;

    break;
    }
    }

    NSString *calendarIdentifier = calendar.calendarIdentifier;

    NSError *error = nil;

    BOOL saved = [self.eventStore saveCalendar:calendar commit:YES error:&error];

    if (saved)
    {
    [[NSUserDefaults standardUserDefaults] setObject:calendarIdentifier forKey:@my_calendar_identifier];
    }
    else
    {
    // unable to save calendar
    }
    }

    }
    }];
    }
Connectez-vous ou Inscrivez-vous pour répondre.