系统日历提醒事件获取与添加
2019-05-14 本文已影响0人
ghost__
针对系统日历相关提醒/事件的处理,iOS提供了两个库
EventKit:该框架提供了对用户日历数据库相关操作的API
EventKitUI:该框架提供了用于显示和编辑日历事件的视图控制器
官方的介绍可以看看,==》官方介绍
重要提示: iOS 10.0上或之后链接的iOS应用必须在其
Info.plist
文件中包含其需要访问的数据类型的使用说明密钥,否则将崩溃。要专门访问提醒和日历数据,它必须分别包括NSRemindersUsageDescription
和NSCalendarsUsageDescription
NSRemindersUsageDescription:App需要您的同意,才能访问提醒事项
NSCalendarsUsageDescription:App需要您的同意,才能访问日历
1.EventKit 针对日历事件/提醒的相关操作
#import <EventKit/EventKit.h>
//以下,EventKit库中相关类
#import <EventKit/EventKitDefines.h>
#import <EventKit/EKTypes.h>
#import <EventKit/EKAlarm.h>
#import <EventKit/EKEventStore.h>
#import <EventKit/EKCalendar.h>
#import <EventKit/EKError.h>
#import <EventKit/EKEvent.h>
#import <EventKit/EKParticipant.h>
#import <EventKit/EKRecurrenceRule.h>
#import <EventKit/EKReminder.h>
#import <EventKit/EKSource.h>
#import <EventKit/EKStructuredLocation.h>
==>1.事件添加:添加的事件,在系统日历中查看
//1.权限查看 用户需要开启权限才可操作
EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]){
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
//2-1.权限问题 无法进行添加
if (error){
NSLog(@"添加失败,请稍后重试");
}else if (!granted){
NSLog(@"不允许使用日历,请在设置中允许此App使用日历");
}else{
//2-2.赋予权限 进行下一步添加
//3.创建事件实例 并添加到事件存储区
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
//3-1.设置必要的配置
event.startDate = [NSDate dateWithTimeIntervalSinceNow:60];//开始时间
event.endDate = [NSDate dateWithTimeIntervalSinceNow:60*5];//结束时间
event.allDay = NO;//是否全天提醒
event.title = @"添加事件";//事件的标题
//添加地理信息
EKStructuredLocation *structuredLocation = [EKStructuredLocation locationWithTitle:@"地理位置"];
structuredLocation.geoLocation = [[CLLocation alloc] initWithLatitude:120.12 longitude:30.16];
structuredLocation.radius = 10;
event.structuredLocation = structuredLocation;
//事件所属日历
event.calendar = [eventStore defaultCalendarForNewEvents];
//添加闹钟 这里最多可添加两个闹钟
event.alarms = @[[EKAlarm alarmWithRelativeOffset:10],[EKAlarm alarmWithRelativeOffset:15]];
//3-2.保存事件到事件存储区->系统日历
NSError *error;
[eventStore saveEvent:event span:EKSpanThisEvent error:&error];
// /*
// 这里还有一个批量处理的方法
// event: 事件实例
// span: EKSpanThisEvent->仅影响当前事件 EKSpanFutureEvents->影响这个事件及其后的一切
// commit: NO 暂存当前事件 但不提交到系统日历 YES 立即提交存入系统日历
// error: 保存处理过程中的错误
// */
// [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
// /*
// 上述func commit 设置NO时 会暂存 然后调用下面的commit才会提交到事件存储区->系统日历
// */
// NSError *commitErr;
// [eventStore commit:&commitErr];
}
});
}];
}
==>2.添加提醒:添加的提醒,在系统提醒事项中查看
//1.权限查看 用户需要开启权限才可操作
EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]){
[eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
//2-1.权限问题 无法进行添加
if (error){
NSLog(@"添加失败,请稍后重试");
}else if (!granted){
NSLog(@"不允许使用日历,请在设置中允许此App使用日历");
}else{
//2-2.赋予权限 进行下一步添加
//3.创建提醒实例 并进行添加
EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];
//3-1.设置reminder 必要属性
reminder.title = @"今天去看牙";//提醒的标题
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *startComponents = [calendar componentsInTimeZone:[NSTimeZone systemTimeZone] fromDate:[NSDate dateWithTimeIntervalSinceNow:30]];
NSDateComponents *dueComponents = [calendar componentsInTimeZone:[NSTimeZone systemTimeZone] fromDate:[NSDate dateWithTimeIntervalSinceNow:60]];
startComponents.timeZone = [NSTimeZone systemTimeZone];
dueComponents.timeZone = [NSTimeZone systemTimeZone];
reminder.startDateComponents = startComponents; //开始提醒的日期。
reminder.dueDateComponents = dueComponents;//预期完成提醒的日期
reminder.completed = NO;//设置YES将把实际完成的日期设置为当前日期。
// reminder.completionDate //实际完成提醒的日期
reminder.priority = EKReminderPriorityHigh; //优先级
//提醒所属日历
reminder.calendar = [eventStore defaultCalendarForNewReminders];
//添加闹铃
reminder.alarms = @[[EKAlarm alarmWithRelativeOffset:5],[EKAlarm alarmWithRelativeOffset:10]];
//4.保存提醒实例到提醒空间
NSError *error;
[eventStore saveReminder:reminder commit:YES error:&error];
/*
设置commit NO。可以进行批量处理
store 调用commit 进行批量提交
*/
// NSError *commitError;
// [eventStore commit:&commitError];
NSLog(@"%@-%@",error,reminder);
}
});
}];
}
==>3.提取提醒/事件
//事件提取
//1.权限查看 用户需要开启权限才可操作
EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]){
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
//2-1.权限问题 无法进行添加
if (error){
NSLog(@"添加失败,请稍后重试");
}else if (!granted){
NSLog(@"不允许使用日历,请在设置中允许此App使用日历");
}else{
//2-2.赋予权限 进行下一步添加
//3.提取事件
//这里谓词 区间最大貌似是四年 设置的时候注意
//另外:提取事件的时候 只能通过这个来设置谓词
NSPredicate *eventPredicate = [eventStore predicateForEventsWithStartDate:[NSDate dateWithTimeInterval:-60*60*24*365*4 sinceDate:[NSDate date]] endDate:[NSDate date] calendars:@[[eventStore defaultCalendarForNewEvents]]];
NSLog(@"%@",eventPredicate);
[eventStore enumerateEventsMatchingPredicate:eventPredicate usingBlock:^(EKEvent * _Nonnull event, BOOL * _Nonnull stop) {
NSLog(@"%@",event);
}];
}
});
}];
}
//提醒提取
//1.权限查看 用户需要开启权限才可操作
EKEventStore *eventStore = [[EKEventStore alloc] init];
if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]){
[eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
//2-1.权限问题 无法进行添加
if (error){
NSLog(@"添加失败,请稍后重试");
}else if (!granted){
NSLog(@"不允许使用日历,请在设置中允许此App使用日历");
}else{
//2-2.赋予权限 进行下一步添加
//3.提取提醒
NSPredicate *predicate = [eventStore predicateForRemindersInCalendars:@[[eventStore defaultCalendarForNewReminders]]];
[eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray<EKReminder *> * _Nullable reminders) {
[reminders enumerateObjectsUsingBlock:^(EKReminder * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@-%@",obj.title,obj);
}];
}];
}
});
}];
}
==>4.几个主要类
==>4-1 EKEventStore 访问用户日历和提醒事件并支持新事件计划的对象。
==>4-2 EKEvent 事件实例(设置相关信息 地理位置 闹钟提醒等)
==>4-3 EKReminder 提醒实例(设置相关信息 闹钟提醒等 这里地理信息没法设置 但是在设置闹钟的实例中能进行相关的设置)
==>4-4 EKAlarm 闹钟实例(先关设置 地理信息等)
==>4-5 EKRecurrenceRule 设置重复规则(日 周 月 年)
==>4-6 EKStructuredLocation 配置地理信息