调用系统的日历和提醒功能时,需要使用导入相关类库头文件#import <EventKit/EventKit.h>
。
日历功能
写入
- (void)addCalendarWithTitle:(NSString *)title content:(NSString *)content location:(NSString *)location rule:(EKRecurrenceRule *)rule startDate:(NSDate *)startDate endDate:(NSDate *)endDate allDay:(BOOL)allDay alarmArray:(NSArray *)alarmArray complete:(void (^)(EKAuthorizationStatus status, BOOL success, NSError *error))complete
{
EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
BOOL result = NO;
NSError *errorTmp = error;
//
if (error) {
} else if (!granted) {
} else {
result = YES;
//
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
// 标题
event.title = (title && title.length > 0) ? title : @"无标题";
// 内容
if (content && content.length > 0) {
event.notes = content;
}
// 地点
if (location && location.length > 0) {
event.location = location;
}
NSDateFormatter *tempFormatter = [[NSDateFormatter alloc] init];
[tempFormatter setDateFormat:@"dd.MM.yyyy HH:mm"];
// 开始时间
event.startDate = startDate;
// 结束时间
event.endDate = endDate;
// 是否全天
event.allDay = allDay;
// 重复规则
if (rule) {
[event addRecurrenceRule:rule];
}
// 添加提醒
[alarmArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSDate *date = (NSDate *)obj;
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date];
[event addAlarm:alarm];
}];
// 添加到日历
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
// 保存
NSError *err;
result = [eventStore saveEvent:event span:EKSpanThisEvent error:&err];
errorTmp = err;
}
dispatch_async(dispatch_get_main_queue(), ^{
if (complete) {
complete(status, result, errorTmp);
}
});
});
}];
}
}
读取
- (void)readCalendar:(void (^)(EKAuthorizationStatus status, BOOL success, NSArray <EKEvent *> *events))complete
{
EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
if (status == EKAuthorizationStatusAuthorized) {
NSDate *dateStart = [NSDate date];
NSDate *dateEnd = [dateStart dateByAddingTimeInterval:1000];
// 日历
EKEventStore *eventStore = [[EKEventStore alloc] init];
NSArray *array = [eventStore calendarsForEntityType:EKEntityTypeEvent];
NSMutableArray *arrayTmp = [NSMutableArray new];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
EKCalendar *calendar = (EKCalendar *)obj;
EKCalendarType type = calendar.type;
if ([@[@(EKCalendarTypeLocal), @(EKCalendarTypeCalDAV)] containsObject:@(type)]) {
[arrayTmp addObject:calendar];
}
}];
NSPredicate *predicate = [eventStore predicateForEventsWithStartDate:dateStart endDate:dateEnd calendars:arrayTmp];
NSArray *result = [eventStore eventsMatchingPredicate:predicate];
result = [result sortedArrayUsingSelector:@selector(compareStartDateWithEvent:)];
if (complete) {
complete(status, YES, result);
}
} else {
if (complete) {
complete(status, NO, nil);
}
}
}
删除
- (BOOL)removeCalendarWithEKEvent:(EKEvent *)event
{
if (event) {
EKEventStore *eventStore = [[EKEventStore alloc] init];
return [eventStore removeEvent:event span:EKSpanThisEvent commit:YES error:nil];
}
return NO;
}
提醒功能
写入
- (void)addReminderWithTitle:(NSString *)title content:(NSString *)content priority:(NSUInteger)priority rule:(EKRecurrenceRule *)rule startDate:(NSDate *)startDate endDate:(NSDate *)endDate alarmArray:(NSArray *)alarmArray complete:(void (^)(EKAuthorizationStatus status, BOOL success, NSError *error))complete
{
EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {
[eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError * _Nullable error) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
BOOL result = NO;
NSError *errorTmp = error;
//
if (error) {
} else if (!granted) {
} else {
// 创建一个提醒功能
EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];
// 标题
reminder.title = title;
// 添加提醒
[reminder setCalendar:[eventStore defaultCalendarForNewReminders]];
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];
NSInteger flags = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond);
// 开始时间
NSDateComponents *dateStart = [calendar components:flags fromDate:startDate];
dateStart.timeZone = [NSTimeZone systemTimeZone];
reminder.startDateComponents = dateStart;
// 到期时间
NSDateComponents *dateEnd = [calendar components:flags fromDate:endDate];
dateEnd.timeZone = [NSTimeZone systemTimeZone];
reminder.dueDateComponents = dateEnd;
// 优先级(0,1,2,3)
reminder.priority = priority;
// 重复规则
if (rule) {
[reminder addRecurrenceRule:rule];
}
// 添加提醒
[alarmArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSDate *date = (NSDate *)obj;
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date];
[reminder addAlarm:alarm];
}];
NSError *err;
result = [eventStore saveReminder:reminder commit:YES error:&err];
errorTmp = err;
}
dispatch_async(dispatch_get_main_queue(), ^{
if (complete) {
complete(status, result, errorTmp);
}
});
});
}];
}
}
读取
- (void)readReminder:(void (^)(EKAuthorizationStatus status, BOOL success, NSArray <EKReminder *> *reminders))complete
{
EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
if (status == EKAuthorizationStatusAuthorized) {
// 提醒
EKEventStore *eventStoreReminder = [[EKEventStore alloc] init];
NSArray *arrayReminder = [eventStoreReminder calendarsForEntityType:EKEntityTypeReminder];
NSMutableArray *arrayTmpReminder = [NSMutableArray new];
[arrayReminder enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
EKCalendar *calendarReminder = (EKCalendar *)obj;
[arrayTmpReminder addObject:calendarReminder];
}];
//
NSPredicate *predicateReminder = [eventStoreReminder predicateForRemindersInCalendars:arrayTmpReminder];
[eventStoreReminder fetchRemindersMatchingPredicate:predicateReminder completion:^(NSArray<EKReminder *> * _Nullable reminders) {
if (complete) {
complete(status, YES, reminders);
}
}];
} else {
if (complete) {
complete(status, NO, nil);
}
}
}
删除
- (BOOL)removeReminderWithEKEvent:(EKReminder *)reminder
{
if (reminder) {
EKEventStore *eventStore = [[EKEventStore alloc] init];
return [eventStore removeReminder:reminder commit:YES error:nil];
}
return NO;
}