EventKit是在iOS和OS X下都可以使用的框架蹦锋。今天主要展示的是如何給提醒事件添加重復提醒钞速。
簡單來說EKEvent 添加的事件在日歷項中展示璧眠,EKReminder 添加的事件在提醒事項中展示琴锭。
#import <EventKit/EventKit.h>
添加前都要獲取“提醒事件”權(quán)限:
//生成事件數(shù)據(jù)庫對象
EKEventStore *eventDB = [[EKEventStore alloc] init];
//申請事件類型權(quán)限
[eventDB requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
if (granted) { //授權(quán)是否成功
}
}];
值得注意的是欲芹,block內(nèi)的方法是在子線程中的蝌借。
這里簡單展示添加 日歷項 和 提醒事項 的方法
1.添加日歷項:
EKEvent *myEvent = [EKEvent eventWithEventStore:eventDB]; //創(chuàng)建一個日歷事件
myEvent.title = title; //標題
myEvent.startDate = date; //開始date required
myEvent.endDate = date; //結(jié)束date required
[myEvent addAlarm:[EKAlarm alarmWithAbsoluteDate:date]]; //添加一個鬧鐘 optional
[myEvent setCalendar:[eventDB defaultCalendarForNewEvents]]; //添加calendar required
NSError *err;
[eventDB saveEvent:myEvent span:EKSpanThisEvent error:&err]; //保存
2.添加提醒事項:
//創(chuàng)建一個提醒功能
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; //優(yōu)先級
//添加一個鬧鐘
EKAlarm *alarm = [EKAlarm alarmWithAbsoluteDate:date];
[reminder addAlarm:alarm];
NSError *err;
[eventDB saveReminder:reminder commit:YES error:&err];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (err) {
TJMLog(@"設(shè)置提醒失斘羟啤:%@",err.localizedDescription);
} else {
TJMLog(@"設(shè)置提醒成功");
}
}];
重復需要用到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;
參數(shù)說明:[1]
參數(shù)名 | 參考值 | 組合方式 | 舉例 |
---|---|---|---|
days | 具體周幾 EKRecurrenceDayOfWeek類型的數(shù)組 | 只要type!=EKRecurrenceFrequencyDaily時都可以使用 | days包含EKTuesday和EKFriday兩個元素表示每個周二和周四都執(zhí)行事件 |
monthDays 月中的哪幾天 |
一個NSNumber的數(shù)組,取值范圍-31-31且不能為0菩佑,負數(shù)表示從月底往前算 | 只有當type==EKRecurrenceFrequencyDaily時 | monthDays包含-1和1兩個元素自晰,那么將在每個月的第一天和最后一天執(zhí)行事件 |
months 一年中的哪幾個月 |
一個NSNumber的數(shù)組,取值范圍1-12稍坯,即1月到12月 只有當type==EKRecurrenceFrequencyYearly時 | months包含-1和1兩個元素酬荞,那么將在每個月的第一天和最后一天執(zhí)行事件 | |
weeksOfTheYear | 一個NSNumber的數(shù)組,取值范圍-53到53瞧哟,負數(shù)表示從年底往前算(每年有53個周) | 只有當type==EKRecurrenceFrequencyYearly時 | 如果你設(shè)置的原始的事件觸發(fā)時間是周三混巧,然后設(shè)置weeksOfTheYear為1和-1兩個元素,則表示每年第一周的周三和最后一周的周三觸發(fā)事件勤揩。但如果你沒設(shè)置周三咧党,只設(shè)置第一周和最后一周的話,事件并不會被觸發(fā) |
daysOfTheYear一年中的哪幾天 | 一個NSNumber的數(shù)組雄可,取值范圍-366到366凿傅,負數(shù)表示從年底往前算 | 只有當type==EKRecurrenceFrequencyYearly時 | daysOfTheYear包含-1和1兩個元素缠犀,那么將在每年的第一天和最后一天執(zhí)行事件 |
setPositions | 這里的position并不是地理位置。該參數(shù)取決于其他參數(shù)的設(shè)置聪舒,表示根據(jù)其他重復規(guī)則辨液,第幾次會執(zhí)行 | 一個NSNumber的數(shù)組,取值范圍-366到366箱残,負數(shù)表示從會發(fā)生的情況中的最后一種往前數(shù) | 只要type!=EKRecurrenceFrequencyDaily時都可以使用 假設(shè)當前有一個事件標識一年中每周的一到五執(zhí)行滔迈,當setPositions中的值為1和-1時,表示只有這一年第一周的一到五和最后一周的一到五才會觸發(fā)事件 |
你可以對上表中的參數(shù)賦予任何值被辑,也可以忽略燎悍,如果你提供了多種參數(shù)組合,則只會執(zhí)行days的方式盼理。 設(shè)定完了重復規(guī)則之后谈山,可以調(diào)用 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