MacOS 开发

来源:互联网 发布:驾驶员网络培训 编辑:程序博客网 时间:2024/06/08 05:37

  • 一EventKit事件库框架
    • 设置授权
      • 1在 infoplist 中添加授权描述
      • 2获取授权状态 authorizationStatusForEntityType
        • 授权状态枚举
      • 3请求权限 requestAccessToEntityType
        • EKEntityType 有两类
        • 请求权限效果如下
  • 二EKReminder 提醒事项
    • 1添加提醒事项
    • 2获取提醒事项
  • 三EKCalendar 日历
    • 1添加日历项
    • 2获取日历项
  • 参考资料


一、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;}


参考资料

  • exialym:EventKit
    http://www.jianshu.com/p/a6255378caa0

  • Echo126:iOS读,写,删除系统提醒事项和日历事件(二)
    http://www.jianshu.com/p/5f3489d162e6

原创粉丝点击