2015-02-01 9 views
10

Ich entwickle Kalender App. Ich versuche, EKEvent mit zugewiesenem EKCalender zu speichern. Aber wenn ich versuche, folgenden Code auszuführen, gibt es mir einen Fehler. Bitte helfenFehler beim Abrufen freigegebener Kalendereinladungen für Entitätstypen 3, Xcode 6.1.1. EKCalender, EKSource, EKEventstore und 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; 
    } 

oben Code gibt folgende Fehler

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.)" 

wie kann ich es loswerden bitte?

Antwort

12

Ich hatte das gleiche Problem in meiner App. Ich bemerkte, dass der Fehler auftritt, wenn calendarWithIdentifier Methode aufgerufen wird.

Ich weiß nicht genau, warum es passiert, aber ich denke, es passiert, wenn Sie keinen gemeinsamen Kalender auf Ihrem Gerät haben. Hier ist ein Link About shared iCloud calendars

fand ich die Lösung here und regelte ich es in meiner app mit dem nächsten Code-Schnipsel:

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

Off Natürlich ist es nicht sehr guter Weg, aber Fehler verschwunden. Ich hoffe, es hilft Ihnen;)

+1

Guter Hinweis, dass dies nur passieren kann, wenn keine freigegebenen Kalender vorhanden sind! – ctietze

+0

Ich bekomme das hin und wieder auf einem Gerät mit einer Reihe von freigegebenen Kalender, aber mit Google statt iCloud. Es scheint die Funktionalität nicht zu beeinträchtigen, aber es macht das Debugging einer PITA, da es das Protokoll mit Mist überflutet. –

+0

Funktioniert großartig.Vielen Dank :) –

0

Eine weitere Ursache für diesen Fehler ist die Verwendung der Bitmaske EKEntityMaskEvent anstelle des Typs EKEntityTypeEvent für den Entitätstyp-Parameter zum Erstellen des Kalenders.

Wenn Sie versuchen, den Kalender zu erstellen, wie:

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

der Kalender dann auch mit einer Kennung zurückgegeben wird, aber der Kalender scheint nicht gültig zu sein, und es kann nicht gespeichert werden, obwohl kein Fehler erhalten ist. Kein Ereignis kann nicht hinzugefügt werden. Und die calendarWithIdentifier gibt null zurück.

Die richtige Syntax verwendet EKEntityTypeEvent wie:

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

alte Frage, aber als Referenz, hatte ich dieses Problem, wenn ich von der Arbeit mit Erinnerungen eingeschaltet Ereignisse in dem Kalender. Ich habe vergessen, den Entity-Typ an allen Stellen zu ändern.

Insbesondere war ich den Status meiner Berechtigungen für EKEntityType Erinnerung Laden mit

EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder]; 

und letztere der Benutzerberechtigung für EKEntityType Ereignis mit

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

So frage die Lösung war, die Überprüfung des Status meiner Berechtigungen zu ändern:

EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];