defaultCalendarForNewEvents failed

Cuando bash llamar a [newEventStore defaultCalendarForNewEvents], devuelve un mensaje de error que dice:

[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.} 

La aplicación funciona por un largo tiempo. El problema vino a mí la primera vez. El teléfono ejecuta IOS6 Beta4. el modelo es el iPhone 4. ¿Alguien sabe cuándo fallará el método defaultCalendarForNewEvents? No puedo obtener ninguna información útil de Google.

En iOS6, Apple introdujo un nuevo control de privacidad que permite al usuario controlar la accesibilidad de los contactos y calendarios para cada aplicación. Por lo tanto, en el lado del código, debe agregar alguna forma de solicitar el permiso. En iOS5 o antes, siempre podemos llamar

 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]; } 

La aplicación Ios no podrá obtener datos del Calendario en el sistema iOS6 si no llama a la función – requestAccessToEntityType: completion: para solicitar un cuadro de diálogo y solicitar a los usuarios que otorguen acceso a su aplicación para acceder al Calendario / Recordatorio. El código se verá así:

 //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. } 

// A continuación hay un bloque para verificar que es una versión actual de ios más alta que la versión requerida.

  - (BOOL)checkIsDeviceVersionHigherThanRequiredVersion:(NSString *)requiredVersion { NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; if ([currSysVer compare:requiredVersion options:NSNumericSearch] != NSOrderedAscending) { return YES; } return NO; } 

iOS6+ requiere la autenticación de los usuarios para guardar el evento en el calendario de su dispositivo. Aquí hay un fragmento de código:

  // 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); } 

Y revisa mi this post si tienes problemas para configurar la alarma en la aplicación.

Resuelto Accidentalmente apago el acceso a la aplicación al calendario en Configuración-> Privacidad en IOS6

Tuve el mismo problema, pero finalmente encontré cuál fue el motivo.

Mi caso era agregar mis eventos de Recordatorio y Calendario, pero estaba usando un EKEventStore . Al final los separé y el problema desapareció:

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

Así que ahora estoy usando calendarEventStore para todo lo relacionado con el evento del calendario y remindersEventStore para el recordatorio uno.

En mi opinión, estaba relacionado con el hecho de que defaultCalendarForNewEvents y defaultCalendarForNewReminders() en una entidad EKEventStore .

También esta de los documentos de EKEventStore :

Los objetos de eventos, recordatorios y calendario recuperados de un almacén de eventos no se pueden usar con ningún otro almacén de eventos

Swift forma

(basado en @yunas respuesta)

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

Se abrirá una ventana emergente de “Acceso”

Vaya a Simulador / Configuración del dispositivo / Privacidad / Calendarios / YourApp Toque ON para permitir el acceso al calendario. Y vuelva a intentar su código. Funcionará.

Para usuarios de Xamarin:

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