创建Reminder并添加到EKEventStore中
- (void)addReminderNotify:(NSDate *)date title:(NSString *)title startDate:(NSDate *)startDate endDate:(NSDate *)endDate {
//申请提醒权限
__weak typeof(self) weakSelf = self;
[self.eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
//创建一个提醒功能
EKReminder *reminder = [EKReminder reminderWithEventStore:weakSelf.eventStore];
//标题
reminder.title = title;
//添加日历
[reminder setCalendar:[weakSelf.eventStore defaultCalendarForNewReminders]];
NSCalendar *cal = [NSCalendar currentCalendar];
[cal setTimeZone:[NSTimeZone systemTimeZone]];
NSInteger flags = NSCalendarUnitYear | NSCalendarUnitMonth |
NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute |
NSCalendarUnitSecond;
NSDateComponents *start = [cal components:flags fromDate:date];
start.timeZone = [NSTimeZone systemTimeZone];
NSDateComponents *end = [cal components:flags fromDate:date];
end.timeZone = [NSTimeZone systemTimeZone];
reminder.startDateComponents = start; //开始时间
reminder.dueDateComponents = end; //到期时间
reminder.priority = 1; //优先级
EKRecurrenceDayOfWeek *dayOfWeek1 = [EKRecurrenceDayOfWeek dayOfWeek:EKWeekdayMonday];
EKRecurrenceDayOfWeek *dayOfWeek2 = [EKRecurrenceDayOfWeek dayOfWeek:EKWeekdayWednesday];
EKRecurrenceDayOfWeek *dayOfWeek3 = [EKRecurrenceDayOfWeek dayOfWeek:EKWeekdayFriday];
EKRecurrenceRule *rule = [[EKRecurrenceRule alloc] initRecurrenceWithFrequency:EKRecurrenceFrequencyWeekly interval:3 daysOfTheWeek:@[dayOfWeek1, dayOfWeek2, dayOfWeek3] daysOfTheMonth:nil monthsOfTheYear:nil weeksOfTheYear:nil daysOfTheYear:nil setPositions:nil end:nil];
reminder.recurrenceRules = @[rule];
// reminder.recurrenceRules = @[];
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date]; //添加一个车闹钟
[reminder addAlarm:alarm];
NSError *err;
[weakSelf.eventStore saveReminder:reminder commit:YES error:&err];
if (err == nil) {
[UtilsManager saveRemindersIdentifyString:reminder.calendarItemIdentifier];
}
NSLog(@"myReminder.calendarItemIdentifier ===== %@", reminder.calendarItemIdentifier);
}
}];
}
但是在获取提醒事项中的数据的时候,一直报错
[EventKit] Error getting default calendar for new reminders: Error Domain=EKCADErrorDomain Code=1013 “(null)”
或者
[EventKit] All retries exhausted for CADDatabaseFetchCalendarItemsWithPredic
的错误,就是连接数据源失败,可以往里面添加数据,但是无法从中读取,问题很简单,就是权限不够,需要同时开通日历权限和提醒事项的访问权限:
self.eventStore = [[EKEventStore alloc] init];
// 读取提醒事项中的数据的时候,需要同时开通日历和提醒事项的权限,不然无法获取提醒事项中的数据
[self.eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError * _Nullable error) {
}];
[self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
}];
然后再访问,果然数据就出来了。