32 votes

Échec de defaultCalendarForNewEvents

Lorsque j'essaie d'appeler [newEventStore defaultCalendarForNewEvents], il renvoie un message d'erreur:

 [707:907] defaultCalendarForNewEvents failed: Error Domain=EKCADErrorDomain Code=1013 "The operation couldn't be completed. (EKCADErrorDomain error 1013.)"
[707:907] Error!Failed to save appointment. Description:Error Domain=EKErrorDomain Code=1 "No calendar has been set." UserInfo=0x1fc679f0 {NSLocalizedDescription=No calendar has been set.}
 

L'application fonctionne depuis longtemps. Le problème m'est venu la première fois. Le téléphone exécute IOS6 Beta4. le modèle est l'iphone 4. Est-ce que quelqu'un sait quand la méthode defaultCalendarForNewEvents échouera? Je ne peux pas obtenir d'informations utiles sur Google.

55voto

yunas Points 2702

Sur iOS6, Apple a introduit un nouveau contrôle de confidentialité qui permet à l'utilisateur de contrôler l'accessibilité des contacts et des calendriers pour chaque application. Donc, du côté du code, vous devez ajouter un moyen de demander l'autorisation. Dans iOS5 ou avant, nous pouvons toujours appeler

 EKEventStore *eventStore = [[[EKEventStore alloc] init] autorelease];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
    // iOS 6 and later
    [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
        if (granted) {
            // code here for when the user allows your app to access the calendar
            [self performCalendarActivity:eventStore];
        } else {
            // code here for when the user does NOT allow your app to access the calendar
        }
    }];
} else {
    // code here for iOS < 6.0
    [self performCalendarActivity:eventStore];
}
 

14voto

L'application Ios ne pourra pas obtenir de données du calendrier sur le système iOS6 si vous n'appelez pas la fonction - requestAccessToEntityType: complétement: pour inviter une boîte de dialogue à demander à vos utilisateurs d'accorder l'accès à votre application pour accéder au calendrier / rappel. Le code ressemblera à:

 //CalendarEventHandler.h  
@interface CalendarEventHandler : NSObject
{
EKEventStore *eventStore;
}
@property (nonatomic, strong) EKEventStore *eventStore;


//CalendarEventHandler.m 
self.eventStore =[[EKEventStore alloc] init];
if([self checkIsDeviceVersionHigherThanRequiredVersion:@"6.0"]) {
        [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {

            if (granted){
                //---- codes here when user allow your app to access theirs' calendar.

            }else
            {
                //----- codes here when user NOT allow your app to access the calendar.  
            }  
        }];

    }else {
                //---- codes here for IOS < 6.0.

    }
 

// Ci-dessous, un bloc pour vérifier que la version actuelle d'ios est supérieure à la version requise.

  - (BOOL)checkIsDeviceVersionHigherThanRequiredVersion:(NSString *)requiredVersion
 {
  NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

   if ([currSysVer compare:requiredVersion options:NSNumericSearch] != NSOrderedAscending)
   {
       return YES;
   }

       return NO;
  }
 

7voto

Vaibhav Saran Points 4078

iOS6+ requiert l'authentification des utilisateurs pour enregistrer l'événement dans le calendrier de son appareil. Voici un extrait de code:

     // save to iphone calendar
    EKEventStore *eventStore = [[EKEventStore alloc] init];
    if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
    {
        // iOS 6 and later
        // This line asks user's permission to access his calendar
        [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
        {
            if (granted) // user user is ok with it
            {
                EKEvent *event = [EKEvent eventWithEventStore:eventStore];
                event.title  = aTitle;
                event.allDay = YES;

                NSDateFormatter *dateFormat = [[UIApplicationSingleton sharedManager] aDateFormatter];
                [dateFormat setDateFormat:@"MMM dd, yyyy hh:mm aaa"];
                event.startDate = event.endDate = //put here if start and end dates are same

                [event setCalendar:[eventStore defaultCalendarForNewEvents]];
                NSError *err;

                [eventStore saveEvent:event span:EKSpanThisEvent error:&err];

                if(err)
                    NSLog(@"unable to save event to the calendar!: Error= %@", err);

            }
            else // if he does not allow 
            {
                [[[UIAlertView alloc]initWithTitle:nil message:alertTitle delegate:nil cancelButtonTitle:NSLocalizedString(@"plzAlowCalendar", nil)  otherButtonTitles: nil] show];
                return;
            }
        }];
    }

    // iOS < 6
    else
    {
        EKEvent *event = [EKEvent eventWithEventStore:eventStore];
        event.title  = aTitle;
        event.allDay = YES;

        NSDateFormatter *dateFormat = [[UIApplicationSingleton sharedManager] aDateFormatter];
        [dateFormat setDateFormat:@"MMM dd, yyyy hh:mm aaa"];
        event.startDate = event.endDate = //put here if start and end dates are same

        [event setCalendar:[eventStore defaultCalendarForNewEvents]];
        NSError *err;

        [eventStore saveEvent:event span:EKSpanThisEvent error:&err];

        if(err)
            NSLog(@"unable to save event to the calendar!: Error= %@", err);

    }
 

Et vérifiez mon this post si vous rencontrez des problèmes pour régler l'alarme sur l'application.

3voto

Alex.BIG Points 199

Résolu. Je désactive accidentellement l'accès de l'application au calendrier dans Paramètres-> Confidentialité sur IOS6

0voto

Hayaßusa Points 1

Accédez à Simulateur / Paramètres de l'appareil / Confidentialité / Calendriers / YourApp Appuyez sur ON pour autoriser l'accès au calendrier. Et réessayez votre code. Cela fonctionnera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X