EventKit是在iOS和OS X下都可以使用的框架。今天主要展示的是如何给提醒事件添加重复提醒。
简单来说EKEvent 添加的事件在日历项中展示,EKReminder 添加的事件在提醒事项中展示。
#import <EventKit/EventKit.h>
添加前都要获取“提醒事件”权限:
//生成事件数据库对象
EKEventStore *eventDB = [[EKEventStore alloc] init];
//申请事件类型权限
[eventDB requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
if (granted) { //授权是否成功
}
}];
值得注意的是,block内的方法是在子线程中的。
这里简单展示添加 日历项 和 提醒事项 的方法
1.添加日历项:
EKEvent *myEvent = [EKEvent eventWithEventStore:eventDB]; //创建一个日历事件
myEvent.title = title; //标题
myEvent.startDate = date; //开始date required
myEvent.endDate = date; //结束date required
[myEvent addAlarm:[EKAlarm alarmWithAbsoluteDate:date]]; //添加一个闹钟 optional
[myEvent setCalendar:[eventDB defaultCalendarForNewEvents]]; //添加calendar required
NSError *err;
[eventDB saveEvent:myEvent span:EKSpanThisEvent error:&err]; //保存
2.添加提醒事项:
//创建一个提醒功能
EKReminder *reminder = [EKReminder reminderWithEventStore:eventDB];
//标题
reminder.title = title;
//备注
reminder.notes = notes;
//添加日历
[reminder setCalendar:[eventDB defaultCalendarForNewReminders]];
NSCalendar *cal = [NSCalendar currentCalendar];
[cal setTimeZone:[NSTimeZone systemTimeZone]];
NSInteger flags = NSCalendarUnitYear | NSCalendarUnitMonth|
NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *dateComp = [cal components:flags fromDate:date];
//判断 这个时间是周几 和 每周第一个提醒时间对比
dateComp.timeZone = [NSTimeZone systemTimeZone];
reminder.startDateComponents = dateComp; //开始时间
reminder.dueDateComponents = dateComp; //到期时间
reminder.priority = 1; //优先级
//添加一个闹钟
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date];
[reminder addAlarm:alarm];
NSError *err;
[eventDB saveReminder:reminder commit:YES error:&err];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (err) {
TJMLog(@"设置提醒失败:%@",err.localizedDescription);
} else {
TJMLog(@"设置提醒成功");
}
}];
重复需要用到EKRecurrenceRule 这个类
初始化方法:
- (instancetype)initRecurrenceWithFrequency:(EKRecurrenceFrequency)type
interval:(NSInteger)interval
daysOfTheWeek:(nullable NSArray<EKRecurrenceDayOfWeek *> *)days
daysOfTheMonth:(nullable NSArray<NSNumber *> *)monthDays
monthsOfTheYear:(nullable NSArray<NSNumber *> *)months
weeksOfTheYear:(nullable NSArray<NSNumber *> *)weeksOfTheYear
daysOfTheYear:(nullable NSArray<NSNumber *> *)daysOfTheYear
setPositions:(nullable NSArray<NSNumber *> *)setPositions
end:(nullable EKRecurrenceEnd *)end;
参数说明:[1]
参数名 | 参考值 | 组合方式 | 举例 |
---|---|---|---|
days | 具体周几 EKRecurrenceDayOfWeek类型的数组 | 只要type!=EKRecurrenceFrequencyDaily时都可以使用 | days包含EKTuesday和EKFriday两个元素表示每个周二和周四都执行事件 |
monthDays 月中的哪几天 |
一个NSNumber的数组,取值范围-31-31且不能为0,负数表示从月底往前算 | 只有当type==EKRecurrenceFrequencyDaily时 | monthDays包含-1和1两个元素,那么将在每个月的第一天和最后一天执行事件 |
months 一年中的哪几个月 |
一个NSNumber的数组,取值范围1-12,即1月到12月 只有当type==EKRecurrenceFrequencyYearly时 | months包含-1和1两个元素,那么将在每个月的第一天和最后一天执行事件 | |
weeksOfTheYear | 一个NSNumber的数组,取值范围-53到53,负数表示从年底往前算(每年有53个周) | 只有当type==EKRecurrenceFrequencyYearly时 | 如果你设置的原始的事件触发时间是周三,然后设置weeksOfTheYear为1和-1两个元素,则表示每年第一周的周三和最后一周的周三触发事件。但如果你没设置周三,只设置第一周和最后一周的话,事件并不会被触发 |
daysOfTheYear一年中的哪几天 | 一个NSNumber的数组,取值范围-366到366,负数表示从年底往前算 | 只有当type==EKRecurrenceFrequencyYearly时 | daysOfTheYear包含-1和1两个元素,那么将在每年的第一天和最后一天执行事件 |
setPositions | 这里的position并不是地理位置。该参数取决于其他参数的设置,表示根据其他重复规则,第几次会执行 | 一个NSNumber的数组,取值范围-366到366,负数表示从会发生的情况中的最后一种往前数 | 只要type!=EKRecurrenceFrequencyDaily时都可以使用 假设当前有一个事件标识一年中每周的一到五执行,当setPositions中的值为1和-1时,表示只有这一年第一周的一到五和最后一周的一到五才会触发事件 |
你可以对上表中的参数赋予任何值,也可以忽略,如果你提供了多种参数组合,则只会执行days的方式。 设定完了重复规则之后,可以调用 addRecurrenceRule: 方法添加到事件中。
举例(每周日,周一,周二提醒):
//添加重复
NSArray *weekArr = @[@1,@2,@3];//1代表周日以此类推
// 也可以写成NSArray *weekArr = @[@(EKWeekdaySunday),@(EKWeekdayMonday),@(EKWeekdayTuesday)];
[weeks enumerateObjectsUsingBlock:^(NSNumber * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
EKRecurrenceDayOfWeek *daysOfWeek = [EKRecurrenceDayOfWeekdayOfWeek:obj.integerValue];
[weekArr addObject:daysOfWeek];
}];
EKRecurrenceRule *rule = [[EKRecurrenceRule alloc]initRecurrenceWithFrequency:EKRecurrenceFrequencyWeekly interval:1 daysOfTheWeek:weekArr daysOfTheMonth:nil monthsOfTheYear:nil weeksOfTheYear:nil daysOfTheYear:nil setPositions:nil end:nil];
[reminder addRecurrenceRule:rule];
参考:
【1】http://blog.csdn.net/wangbingwf0536/article/details/45579919