Lokaler EKCalendar (Erinnerungen) kann nicht erstellt werden, wenn iCloud so eingestellt ist, dass Erinnerungen nicht synchronisiert werden

Hier ist ein sehr seltsames Problem aufgetreten, das meines Erachtens ein Problem mit der EventKit-API ist, und ich möchte nur überprüfen, ob es nichts ist, was ich tue.

Testfall 1:

Erinnerungen sind in Datenschutz für die App aktiviertDas Gerät verfügt über ein iCloud-Konto, ist jedoch so eingestellt, dass Erinnerungen nicht synchronisiert werdenIch kann einen erstellenlokal Erinnerungsliste in der App 'Erinnerungen' von ApplePROBLEM - Der Versuch, einen neuen Kalender vom Entitätstyp EKEntityTypeReminder mit einer Quelle vom Typ EKSourceTypeLocal zu erstellen, schlägt fehl

Testfall 2:

Erinnerungen sind in Datenschutz für die App aktiviertDas Gerät hat kein iCloud-KontoIch kann einen erstellenlokal Erinnerungsliste in der App 'Erinnerungen' von AppleIch kann über die EK-API eine lokale Erinnerungsliste erstellen

Testfall 3:

Erinnerungen sind in Datenschutz für die App aktiviertDas Gerät verfügt über ein iCloud-Konto und ist so eingestellt, dass Erinnerungen synchronisiert werdenIch kann einen erstelleniCloud Erinnerungsliste in der App 'Erinnerungen' von AppleIch kann über die EK-API eine iCloud-Erinnerungsliste erstellen

Bin ich verrückt oder ist das ein Fehler mit der API?

Prost!

Hier ist der Code:

EKCalendar *remindersList = nil;
NSString *remindersListIdent = [[NSUserDefaults standardUserDefaults] objectForKey:kReminderListIdentDefaultsKey];

if(remindersListIdent) {
    remindersList = [store calendarWithIdentifier:remindersListIdent];

    if(remindersList) {
        // has valid reminders list so save reminder and return (don't run rest of function)
        [self saveReminder:reminder toCalendar:remindersList withTypeLabel:reminderTypeLabel];
        return;
    }
}

NSArray *currentCalendars = [store calendarsForEntityType:EKEntityTypeReminder];
for(EKCalendar *cal in currentCalendars) {
    if([[cal title] isEqualToString:@"My App Name"]) {
        remindersList = cal;

        [[NSUserDefaults standardUserDefaults] setObject:[remindersList calendarIdentifier] forKey:kReminderListIdentDefaultsKey];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [self saveReminder:reminder toCalendar:remindersList withTypeLabel:reminderTypeLabel];
        return;
    }
}

EKSource *localSource = nil;
for (EKSource *source in store.sources) {
    if (source.sourceType == EKSourceTypeCalDAV && [source.title isEqualToString:@"iCloud"]) {
        localSource = source;
        break;
    }
}
if(localSource) {
    remindersList = [self newCalendarListInSource:localSource];
}

if(!remindersList) {
    for (EKSource *source in store.sources) {
        if (source.sourceType == EKSourceTypeLocal) {
            localSource = source;
            remindersList = [self newCalendarListInSource:localSource];
            if(remindersList) {
                break;
            }
        }
    }
}

if(!remindersList) {
    dispatch_async(dispatch_get_main_queue(), ^{
        // show error message
    });
}
else {
    [[NSUserDefaults standardUserDefaults] setObject:[remindersList calendarIdentifier] forKey:kReminderListIdentDefaultsKey];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self saveReminder:reminder toCalendar:remindersList withTypeLabel:reminderTypeLabel];
}

Und das ist der Inhalt von newCalendarListInSource:

EKCalendar *remindersList;

remindersList = [EKCalendar calendarForEntityType:EKEntityTypeReminder eventStore:store];
remindersList.source = localSource;
[remindersList setTitle:@"My App Name"];
NSError *listCreateError = nil;
[store saveCalendar:remindersList commit:YES error:&listCreateError];

if(!listCreateError) {
    return remindersList;
}
else {
    NSLog(@"Failed to create reminders list with error: %@", [listCreateError localizedDescription]);

Antworten auf die Frage(1)

Ihre Antwort auf die Frage