iOS EventKit 添加日历及提醒事项(重复提醒)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341