web-dev-qa-db-fra.com

defaultCalendarForNewEvents a échoué

Lorsque j'essaie d'appeler [newEventStore defaultCalendarForNewEvents], un message d'erreur s'affiche: 

[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 est venu à moi pour la première fois. Le téléphone fonctionne sous IOS6 Beta4. model is iphone 4 . Quelqu'un sait-il quand la méthode defaultCalendarForNewEvents va échouer? Je ne peux obtenir aucune information utile de googler.

32
Alex.BIG

Sur iOS6, Apple a introduit un nouveau contrôle de confidentialité permettant à l'utilisateur de contrôler l'accessibilité des contacts et des calendriers pour chaque application. Donc, côté 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];
}
54
yunas

L'application Ios ne sera pas en mesure d'obtenir des données du calendrier sur le système iOS6 si vous n'appelez pas le - requestAccessToEntityType: completion: function to Invite une boîte de dialogue demandant aux utilisateurs d'autoriser l'accès à ton 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 si la version actuelle de l'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;
  }
14
Alphonse R. Dsouza

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.

7
Vaibhav Saran

Résolu . J'ai accidentellement désactivé l'accès de l'application au calendrier dans Configuration-> Confidentialité sur IOS6.

3
Alex.BIG

J'ai eu le même problème, mais finalement trouver quelle était la raison.

Mon cas était d’ajouter mes événements de rappel et de calendrier, mais j’en utilisais une EKEventStore. Finalement, je les sépare et le problème disparaît:

private static let calendarEventStore = EKEventStore()
private static let remindersEventStore = EKEventStore()

Alors maintenant, j'utilise calendarEventStore pour tout ce qui concerne l'événement de calendrier et remindersEventStore pour le premier rappel.

——

À mon avis, cela était lié au fait que j'avais demandé defaultCalendarForNewEvents et defaultCalendarForNewReminders() dans une entité EKEventStore.

Aussi celui-ci de EKEventStore docs: 

Objets Events, Rappels et Calendrier extraits d'un magasin d'événements ne peut être utilisé avec aucun autre magasin d'événements

3
Alexander Zimin

Formulaire rapide

(basé sur la réponse de @yunas)

_estore = EKEventStore()
_estore.reset()

_estore.requestAccessToEntityType(EKEntityTypeEvent) { (granted, error) in
    if granted {
        println("allowed")
        /* ... */
    } else {
        println("not allowed")
    }           
}

Il va ouvrir "Accès" pop-up

1
Maxim Shoustin

Pour les utilisateurs de Xamarin:

EKEventStore eventStore = new EKEventStore();
eventStore.RequestAccess(EKEntityType.Event, (bool granted, NSError e) =>
{
    if (granted)
    {
       //Your code here when user gief permissions
    }
});

Accédez à Simulateur/Paramètres du périphérique/Confidentialité/Calendriers/Votre appli. Appuyez sur ON pour autoriser l'accès au calendrier… ..et réessayez votre code.Il fonctionnera.

0
Warewolf