MacOS 开发 - EventKit、EKReminder、EKCalendar(日历、提醒事项)

版权声明:本文为博主原创文章,转载请附上本文链接地址。from : https://blog.csdn.net/lovechris00 https://blog.csdn.net/lovechris00/article/details/78156186


一、EventKit(事件库框架)

使用日历和提醒事项,必须导入 EventKit 框架。在 project 中添加框架后,控制器中需要 #import <EventKit/EventKit.h>

EventKit授 权访问用户的 Calendar.app(日历) 和 Reminders.app(提醒事项) 应用的信息。尽管是用两个不同的应用显示用户的日历和提醒数据,但确是同一个框架维护这份数据。他们使用相同的库(EKEventStore)处理数据。

该框架除了允许检索用户已经存在的calendar和reminder数据外,还允许创建新的事件和提醒。更高级的任务,诸如添加闹钟或指定循环事件,也可以使用事件库完成。

设置、授权

无论是调用日历,还是提醒事项,都需要进行以下操作:

1、在 info.plist 中添加授权描述

这些描述会在请求权限的弹窗中显示。

EventKit

2、获取授权状态 authorizationStatusForEntityType

EKAuthorizationStatus eventStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];

授权状态枚举

typedef NS_ENUM(NSInteger, EKAuthorizationStatus) {
    EKAuthorizationStatusNotDetermined = 0,//用户还没授权过
    EKAuthorizationStatusRestricted,//未授权,且用户无法更新,如家长控制情况下
    EKAuthorizationStatusDenied,//用户授权不允许
    EKAuthorizationStatusAuthorized,//用户已经允许授权
} NS_AVAILABLE(10_9, 6_0);

3、请求权限 requestAccessToEntityType

//提示用户授权,调出授权弹窗
        [[[EKEventStore alloc]init] requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
            if(granted){
                NSLog(@"允许");
            }else{ NSLog(@"拒绝授权");
            }
}];

EKEntityType 有两类

  • EKEntityTypeEvent日历事件
  • EKEntityTypeReminder//提醒事项

请求权限效果如下:

EventKit请求权限


二、EKReminder 提醒事项

1、添加提醒事项

- (void)addReminderItem{

    EKEventStore *eventStore = [[EKEventStore alloc]init];

    [eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError * _Nullable error) {

        EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];

        reminder.calendar = [eventStore defaultCalendarForNewReminders];

        reminder.title = @"提醒你哦";
        reminder.calendar = [eventStore defaultCalendarForNewReminders];;

        EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:[NSDate dateWithTimeIntervalSinceNow:20]];

        [reminder addAlarm:alarm];

        NSError *err = nil;

        [eventStore saveReminder:reminder commit:YES error:&err];

        if (error) {
            NSLog(@"error=%@",error);
        }else{
            NSLog(@"保存到提醒事项成功");
        }
    }];

}

EKReminder


2、获取提醒事项


- (void)getReminders{

    EKEventStore *eventStore = [[EKEventStore alloc]init];
    NSArray *reminderArray = [eventStore calendarsForEntityType:EKEntityTypeReminder];

    [eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError * _Nullable error) {

        if (!granted) {
            return ;
        }

        //获取提醒事项的分类
        for (EKCalendar *calendar in reminderArray) {
            NSLog(@"title:%@ , type:%ld , calendarIdentifier:%@",calendar.title,(long)calendar.type,calendar.calendarIdentifier);
        }

        //来查找所有的reminders
        NSPredicate *pre =[eventStore predicateForRemindersInCalendars:@[reminderArray.firstObject]];

        //异步方法。
        [eventStore fetchRemindersMatchingPredicate:pre completion:^(NSArray<EKReminder *> * _Nullable reminders) {

            //异步查找出提醒事项数组reminders,这里可根据需求进一步进行对数组的操作
            /*
             reminders 数组里存的是EKReminder 对象。
             列举EKReminder 的一些属性:
             title:标题
             notes:备注
             priority:优先级(NSUInteger)  0无级别,1级别高---9级别低(1-4高,5中等,6-9低)
             completed:是否已完成
             completionDate:完成时间
             alarms:提醒数组(数组里是EKAlarm对象, 可以获得跟闹钟相关的数据,如具体时间,偏移秒数...)
             */
            for (EKReminder *reminder in reminders) {

                NSLog(@"reminder - title:%@ , notes:%@",reminder.title,reminder.notes);
            }
        }];
    }];
}

三、EKCalendar 日历

1、添加日历项

- (void)addCalendarItem{

    EKEventStore *eventStore = [[EKEventStore alloc]init];
    EKEvent *event = [EKEvent eventWithEventStore:eventStore];

    /** 向日历添加一个事件
     * title  事件标题
     * notes  事件备注
     * location 事件地址
     * startDate 开始日期
     * endDate  结束日期
     * alarms 闹钟
     * availability 事件调度
     */

    event.title = @"title";
//    event.location = location;

    //[NSDate dateWithTimeIntervalSinceNow:10];
    //[NSDate dateWithTimeIntervalSinceNow:20];

    NSDate *startDate = [NSDate dateWithTimeIntervalSinceNow:10];
    NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:20];

    //设定事件开始时间
    event.startDate = startDate;
    //设定事件结束时间
    event.endDate=endDate;

    //添加提醒 可以添加多个,设定事件多久以前开始提醒
    //event.allDay = YES;

    //在事件前多少秒开始事件提醒 -5.0f
    EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:-5.f];
    [event addAlarm:alarm];

    [event setCalendar:[eventStore defaultCalendarForNewEvents]];

    NSError *error;
    [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];

    NSLog(@"保存成功");
}

如果增加提示后,效果如下:

EKEvent


2、获取日历项

#pragma mark - 获取日历事件
- (void)getCalendar{

    EKEventStore *store = [[EKEventStore alloc] init];
    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {

        NSLog(@"granted:%d",granted);

        if (granted) {

            NSDate *startDate = [self dateFromString:@"2017-08"];//事件段,开始时间
            NSDate *endDate = [self dateFromString:@"2018-01"];//结束时间,取中间

            NSPredicate *fetchCalendarEvents = [store predicateForEventsWithStartDate:startDate endDate:endDate calendars:nil];

            NSArray<EKEvent *> *eventList = [store eventsMatchingPredicate:fetchCalendarEvents];

            NSArray<EKEvent *> *events = [eventList filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(EKEvent * _Nullable event, NSDictionary<NSString *,id> * _Nullable bindings) {

                return event.calendar.subscribed;

            }]];

            NSLog(@"events:<<<<<<<<<<<< %@ >>>>>>>>>>>",events);

            for (EKEvent *event in events) {

                NSLog(@"title : %@ , startDate : %@ , endDate : %@ , calendarItemIdentifier : %@",event.title,event.startDate,event.endDate,event.calendarItemIdentifier);
            }
        }
    }];
}

- (NSDate *)dateFromString:(NSString *)dateString
{
    //设置转换格式
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
    [formatter setDateFormat:@"yyyy-MM"];
    NSDate *date = [formatter dateFromString:dateString];
    return date;
}


参考资料

没有更多推荐了,返回首页