2015-02-01 6 views
10

Sto sviluppando l'app di calendario. Sto cercando di salvare EKEvent usando EKCalender assegnato. Ma quando provo a eseguire il codice seguente mi dà errore. Si prega di aiutareErrore nell'acquisizione di inviti di calendario condivisi per i tipi di entità 3, Xcode 6.1.1. EKCalender, EKSource, EKEventstore e Objective C

-(BOOL)createEventWithTitle:(NSString *)paramTitle startDate:(NSDate *)paramStartDate endDate:(NSDate *)paramEndDate inCalendar:(EKCalendar *)paramCalendar inEventStore:(EKEventStore *)paramStore notes:(NSString *)paramNotes 
     { 
     BOOL result = NO; 

     //paramCalendar = [self.eventStoreiReportShifts defaultCalendarForNewEvents]; 
      if (self.eventsAccessGranted) { 
       NSArray *caledars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent]; 
       self.selectedCalendarEventKitIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"eventkit_cal_identifiers_string"]; 
       for(EKCalendar *aCal in caledars){ 
        if([aCal.calendarIdentifier isEqualToString:self.selectedCalendarEventKitIdentifier]){ 
         paramCalendar = [self.eventStore calendarWithIdentifier:[[NSUserDefaults standardUserDefaults] objectForKey:@"eventkit_cal_identifiers_string"]]; 
        } 
       } 
       for (EKSource *source in self.eventStore.sources) { 
        if (source.sourceType == EKSourceTypeCalDAV) { 
         paramCalendar.source = source; 
         break; 
        } else if(source.sourceType == EKSourceTypeLocal){ 
         paramCalendar.source = source; 
         break; 
        } 
       } 

     }else{ 
      return NO; 
     } 

     /* If a calendar does not allow modification of its contents 
     then we can not insert an event into it */ 
     if (paramCalendar.allowsContentModifications == NO) { 
      NSLog (@ "\n\n The selected calendar does not allow modifications."); 
      return NO; 
     } 
     /* Create an event */ 

     EKEvent * event = [EKEvent eventWithEventStore:paramStore]; 

     event.calendar = paramCalendar; 
     /* Set the properties of the event such as its title, 
     start date/time, end date/time, etc. */ 
     event.title = paramTitle; 
     event.notes = paramNotes; 
     event.startDate = paramStartDate; 
     event.endDate = paramEndDate; 
     /* Finally, save the event into the calendar */ 
     NSError * saveError = nil; 
     result = [paramStore saveEvent:event 
            span:EKSpanThisEvent 
           error:&saveError]; 
     if (result == NO) { 
      NSLog (@ "\n\n An error occurred = %@", saveError); 
     } 
     return result; 
    } 

sopra codice fornisce seguente errore

CalendarCalculations[1668:45103] 
    Error getting shared calendar invitations for entity types 3 from 
    daemon: Error Domain=EKCADErrorDomain Code=1013 
"The operation couldn’t be completed. (EKCADErrorDomain error 1013.)" 

come posso liberarmi di esso per favore?

risposta

12

Ho avuto lo stesso problema nella mia app. Ho notato che l'errore si verifica quando viene chiamato il metodo calendarWithIdentifier.

EKCalendar *selectedCalendar = [self.eventStore calendarWithIdentifier:selectedCalendarIdentifier]; 

Non so esattamente perché si verifica, ma credo che succede quando non si dispone di alcun calendario condiviso nel dispositivo. Ecco un link About shared iCloud calendars

ho trovato la soluzione here e ho fissato nel mio app con codice successivo frammento:

EKCalendar *selectedCalendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore]; 
NSString *selectedCalendarIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"selectedCalendarIdentifier"]; 

//instead of getting calendar by identifier 
//get all calendars and check matching in the cycle 
NSArray *allCalendars = [self.eventStore calendarsForEntityType:EKEntityTypeEvent]; 
for (EKCalendar *calendar in allCalendars) { 
    if ([calendar.calendarIdentifier isEqualToString:selectedCalendarIdentifier]) { 
     selectedCalendar = calendar; 
     break; 
    } 
} 

Fuori rotta non è molto buona strada, ma l'errore è scomparso. Spero che vi aiuterà;)

+1

Un buon suggerimento che ciò potrebbe accadere solo quando non sono presenti calendari condivisi! – ctietze

+0

Ogni tanto mi capita di trovarlo su un dispositivo che ha un sacco di calendari condivisi, ma che usa Google invece di iCloud. non sembra influire sulla funzionalità, ma effettua il debug di una PITA poiché inonda il log di merda. –

+0

Funziona alla grande.Grazie mille :) –

0

Un'altra causa di questo errore è quello di utilizzare il bit di maschera EKEntityMaskEvent invece che il tipo EKEntityTypeEvent per il parametro tipo di entità creazione del calendario.

Se si tenta di creare il calendario come ad esempio:

EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityMaskEvent eventStore:self.eventStore]; 

Poi il calendario è ben tornato con un identificatore, ma il calendario non sembra essere valido e non può essere salvato anche se nessun errore è ottenere. Nessun evento non può essere aggiunto ad esso. E lo calendarWithIdentifier restituisce zero.

La sintassi destra sta usando EKEntityTypeEvent come ad esempio:

EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityTypeEvent eventStore:self.eventStore]; 
0

vecchia questione, ma, per riferimento, ho avuto questo problema quando sono passato dal lavorare con i ricordi al calendario degli eventi. Ho dimenticato di cambiare il tipo di entità in tutti i posti.

In particolare, mi stava caricando lo stato delle mie autorizzazioni per EKEntityType Reminder con

EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder]; 

e quest'ultimo chiede l'autorizzazione dell'utente per EKEntityType Evento con

[self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
    if (error == nil) { 
     // Store the returned granted value. 
    } else { 
     NSLog(@"%@", [error localizedDescription]); 
    } 
}]; 

Quindi, la soluzione era quello di cambiare il controllo dello stato delle mie autorizzazioni a questo:

EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]; 
Problemi correlati