Не удалось сохранить EKReminder в iOS 6
Я пытаюсь сохранить / получить напоминания из моего приложения, но по какой-то причине EKReminder кажется, что он не сохраняется. Вот мой код:
EKEventStore * _eventStore = [[EKEventStore alloc] init];
[_eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {
//create a new calendar for reminders.
EKCalendar *calendar = [EKCalendar calendarForEntityType:EKEntityTypeReminder eventStore:_eventStore];
EKSource *localSource = nil;
for (EKSource *source in _eventStore.sources)
if (source.sourceType == EKSourceTypeLocal)
{
localSource = source;
break;
}
calendar.source = localSource;
self.calendarIdentifier = calendar.calendarIdentifier;
EKReminder *reminder = [EKReminder reminderWithEventStore:_eventStore];
reminder.calendar = calendar;
reminder.title = @"Test Reminder";
reminder.startDateComponents = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit fromDate:[NSDate date]];
reminder.completionDate = [NSDate dateWithTimeIntervalSinceNow:100];
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:[NSDate dateWithTimeIntervalSinceNow:100]];
reminder.alarms = @[alarm];
NSError *errorOb = nil;
BOOL saved = [_eventStore saveReminder:reminder commit:YES error:&errorOb];
if (saved) NSLog(@"Saved Reminder");
else NSLog(@"Failed to save reminder");
}];
Затем я пытаюсь проверить, действительно ли напоминание было сохранено. Я делаю это с помощью этого кода:
NSPredicate *predicate = [_eventStore predicateForRemindersInCalendars:nil];
[_eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray *reminders) {
for (EKReminder *reminder in reminders) {
NSLog(@"Reminder Title: %@", reminder.title);
}
}];
И мое новое напоминание никогда не появляется!
Может кто-нибудь сказать мне, что я делаю не так здесь??
3 ответа
Вам нужно только позвонить -requestAccessToEntityType:completion:
если статус авторизации EKAuthorizationStatusNotDetermined
, Вы можете проверить статус авторизации, используя +[EKEventStore authorizationStatusForEntityType:]
,
Блок завершения будет вызываться только при первом вызове. -requestAccessToEntityType:completion
, На симуляторе он даже не будет вызываться один раз, потому что на симуляторе ваше приложение уже будет иметь доступ.
EKEventStore * _eventStore = [[EKEventStore alloc] init];
EKAuthorizationStatus authorizationStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder];
if (authorizationStatus == EKAuthorizationStatusNotDetermined) {
[_eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {
if (granted) {
[self createNewReminder];
} else {
[self showNowAccessAlert];
}
}];
} else {
if (authorizationStatus == EKAuthorizationStatusAuthorized) {
[self createNewReminder];
} else {
[self showNowAccessAlert];
}
}
Я заставил это работать, переключив localSource на EKSourceTypeCalDAV. Не совсем уверен, почему это было необходимо, может быть, кто-то может пролить свет на это?
Надеюсь, что это работает для вас.
if([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
// iOS 6 and later
// asks user to allow application to use his device calendar
[eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error)
{
if (granted)
{
EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];
reminder.title = aNotification;
reminder.calendar = [eventStore defaultCalendarForNewReminders];
NSDate *date = //aDate;
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date];
[reminder addAlarm:alarm];
NSError *error = nil;
[eventStore saveReminder:reminder commit:YES error:&error];
if(error)
NSLog(@"unable to Reminder!: Error= %@", error);
}
}];
}
// iOS < 6
else
{
EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];
reminder.title = aNotification;
reminder.calendar = [eventStore defaultCalendarForNewReminders];
NSDate *date = //aDate;
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date];
[reminder addAlarm:alarm];
NSError *error = nil;
[eventStore saveReminder:reminder commit:YES error:&error];
if(error)
NSLog(@"unable to Reminder!: Error= %@", error);
}
И проверьте этот пост, если у вас возникли проблемы с сохранением события в календаре устройства.