授权
为了让提醒事项和日历事件能工作起来,你需要依赖于EventKit。你将也需要一个持久化的存储来保存备忘录项。因此,EventKit为你提供了这个:EKEventStore。一个EKEventStore允许你从用户日历数据库中更新、创建、编辑和删除事件。
提醒事项和日历数据都存储在日历数据库。在理想情况下,你整个应用将只有一个事件存储器,而且你只能实例化其一次,那就是EKEventStore对象需要一个相对比较长的时间去初始化和释放的原因。为每个事件相关的任务去初始化和释放每一个单独分离的事件存储器是极无效率的一件事情,因此,你需要一个单独的事件存储器保证到你应用能运行多久,其就能工作到多久!
你可以看到提醒事项和日历都存储在同一个持久化存储器中,这就是常常指的“日历数据库”。在这个教程中,当你所看到日历,也就意味着日历和提醒事项。但你须知程序员其实都是懒惰的,我们将二者都缩写为日历:]
在你能够获取到用户日历之前你必须获取到用户的日历数据库。iOS将会提醒用户允许或者拒绝日历信息的使用,大多数情况下都是当应用即将要用到日历数据库的时候提醒用户。
具体做法:
初始化:添加EventKit框架 获取日历数据库,以后的操作都是在日历数据库中操作的。
if ([_store respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
[_store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
if (error)
{
isAllow = NO;
//错误细心
// display error message here
}
else if (!granted)
{
isAllow = NO;
//被用户拒绝,不允许访问日历
// display access denied error message here
}
else
{
isAllow = YES;//
}
}];
}
1.获取所有的日历提醒:
if (isAllow)
{
// 获取适当的日期(Get the appropriate calendar)
NSCalendar *calendar = [NSCalendar currentCalendar];
// 创建起始日期组件(Create the start date components)
NSDateComponents *oneDayAgoComponents = [[NSDateComponents alloc] init];
oneDayAgoComponents.day = -1;
NSDate *oneDayAgo = [calendar dateByAddingComponents:oneDayAgoComponents
toDate:[NSDate date]
options:0];
// 创建结束日期组件(Create the end date components)
NSDateComponents *oneYearFromNowComponents = [[NSDateComponents alloc] init];
oneYearFromNowComponents.year = 1;
NSDate *oneYearFromNow = [calendar dateByAddingComponents:oneYearFromNowComponents
toDate:[NSDate date]
options:0];
// 用事件库的实例方法创建谓词 (Create the predicate from the event store's instance method)
/******************************通过谓语的形式获取一年内的所有日历提醒******************************************/
NSPredicate *predicate = [_store predicateForEventsWithStartDate:oneDayAgo
endDate:oneYearFromNow
calendars:nil];
// 获取所有匹配该谓词的事件(Fetch all events that match the predicate)
_eventArray = [_store eventsMatchingPredicate:predicate];
[_eventArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"+>>>>>%lu>>>>>%@",(unsigned long)idx,obj);
EKEvent *everyEvent = (EKEvent *)obj;
_obtainTextView.text = [_obtainTextView.text stringByAppendingString:[NSString stringWithFormat:@"%d--%@--%@--%@",idx,everyEvent.title,everyEvent.eventIdentifier,everyEvent.startDate]];
_obtainTextView.text = [_obtainTextView.text stringByAppendingString:@"\n"];
}];
}
2.添加新日历时间
/******************************添加日历提醒******************************************/
//创建事件
EKEvent *addEvent = [EKEvent eventWithEventStore:_store];
addEvent.title = @"哈哈哈,我是日历事件啊";
addEvent.location = @"我在奋达科技上班";
NSDateFormatter *tempFormatter = [[NSDateFormatter alloc]init];
[tempFormatter setDateFormat:@"dd.MM.yyyy HH:mm"];
addEvent.startDate = [[NSDate alloc]init ];
addEvent.endDate = [[NSDate alloc]init ];
addEvent.allDay = YES;
// //添加提醒
[addEvent addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -60.0f * 24]];//前一天提醒
[addEvent addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * -15.0f]]; //当天十五分钟前提醒
[addEvent addAlarm:[EKAlarm alarmWithRelativeOffset:60.0f * 60.0f*24]]; //后一天提醒
[addEvent setCalendar:[_store defaultCalendarForNewEvents]];
NSError *err;
[_store saveEvent:addEvent span:EKSpanThisEvent error:&err];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Event Created"
message:@"Yay!?"
delegate:nil
cancelButtonTitle:@"Okay"
otherButtonTitles:nil];
[alert show];
NSLog(@"保存成功");
}
}
3.删除日历事件
if (isAllow)
{
//第一种方法:通过谓词来删除
NSPredicate *removePredicate = [NSPredicate predicateWithFormat:@"title matches %@",@"哈哈哈,我是日历事件啊"];
NSArray *resultArray = [_eventArray filteredArrayUsingPredicate:removePredicate];
if ([resultArray count])
{
EKEvent *preEvent = [_eventArray firstObject];
NSError *err = nil;
BOOL isDelete =[_store removeEvent:preEvent span:EKSpanFutureEvents commit:YES error:&err];
if (isDelete)
{
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Delete Event"
message:@"Yay!?"
delegate:nil
cancelButtonTitle:@"Okay"
otherButtonTitles:nil];
[alert show];
NSLog(@"删除成功成功");
}
}
// 第二种方法:直接遍历日历数据库数组
// [_eventArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// EKEvent *removeEvent = (EKEvent *)obj;
// if ([removeEvent.title isEqualToString:@"清明节"])
// {
//
// NSError *err = nil;
// BOOL isDelete =[_store removeEvent:removeEvent span:EKSpanFutureEvents commit:YES error:&err];
// if (isDelete)
// {
// UIAlertView *alert = [[UIAlertView alloc]
// initWithTitle:@"Delete Event"
// message:@"Yay!?"
// delegate:nil
// cancelButtonTitle:@"Okay"
// otherButtonTitles:nil];
// [alert show];
//
// NSLog(@"删除成功成功");
//
// }
// }
// }];
}
3.修改现有的日历事件
if (isAllow)
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title matches %@", @"哈哈哈,我是日历事件啊"];
// Assume there are no duplicates...
//先从日历数据库中通过谓词找到该日历事项 ,或者直接遍历该日历数据库数组,然后进行匹配项删除
NSArray *results = [_eventArray filteredArrayUsingPredicate:predicate];
EKEvent *preEvent = [results firstObject];
preEvent.title = @"修改日历提醒事件";
NSError *error;
//保存修改的日历事项.
[_store saveEvent:preEvent span:EKSpanThisEvent commit:YES error:&error];
if (error) {
// Handle error
}
}
嘿嘿简单操作已经可以了!