針對(duì)系統(tǒng)日歷相關(guān)提醒/事件的處理橱乱,iOS提供了兩個(gè)庫
EventKit:該框架提供了對(duì)用戶日歷數(shù)據(jù)庫相關(guān)操作的API
EventKitUI:該框架提供了用于顯示和編輯日歷事件的視圖控制器
官方的介紹可以看看贿条,==》官方介紹
重要提示: iOS 10.0上或之后鏈接的iOS應(yīng)用必須在其
Info.plist
文件中包含其需要訪問的數(shù)據(jù)類型的使用說明密鑰鼎姐,否則將崩潰鲫懒。要專門訪問提醒和日歷數(shù)據(jù),它必須分別包括NSRemindersUsageDescription
和NSCalendarsUsageDescription
NSRemindersUsageDescription:App需要您的同意,才能訪問提醒事項(xiàng)
NSCalendarsUsageDescription:App需要您的同意富弦,才能訪問日歷
1.EventKit 針對(duì)日歷事件/提醒的相關(guān)操作
#import <EventKit/EventKit.h>
//以下锋华,EventKit庫中相關(guān)類
#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.事件添加:添加的事件,在系統(tǒng)日歷中查看
//1.權(quán)限查看 用戶需要開啟權(quán)限才可操作
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.權(quán)限問題 無法進(jìn)行添加
if (error){
NSLog(@"添加失敗,請(qǐng)稍后重試");
}else if (!granted){
NSLog(@"不允許使用日歷,請(qǐng)?jiān)谠O(shè)置中允許此App使用日歷");
}else{
//2-2.賦予權(quán)限 進(jìn)行下一步添加
//3.創(chuàng)建事件實(shí)例 并添加到事件存儲(chǔ)區(qū)
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
//3-1.設(shè)置必要的配置
event.startDate = [NSDate dateWithTimeIntervalSinceNow:60];//開始時(shí)間
event.endDate = [NSDate dateWithTimeIntervalSinceNow:60*5];//結(jié)束時(shí)間
event.allDay = NO;//是否全天提醒
event.title = @"添加事件";//事件的標(biāo)題
//添加地理信息
EKStructuredLocation *structuredLocation = [EKStructuredLocation locationWithTitle:@"地理位置"];
structuredLocation.geoLocation = [[CLLocation alloc] initWithLatitude:120.12 longitude:30.16];
structuredLocation.radius = 10;
event.structuredLocation = structuredLocation;
//事件所屬日歷
event.calendar = [eventStore defaultCalendarForNewEvents];
//添加鬧鐘 這里最多可添加兩個(gè)鬧鐘
event.alarms = @[[EKAlarm alarmWithRelativeOffset:10],[EKAlarm alarmWithRelativeOffset:15]];
//3-2.保存事件到事件存儲(chǔ)區(qū)->系統(tǒng)日歷
NSError *error;
[eventStore saveEvent:event span:EKSpanThisEvent error:&error];
// /*
// 這里還有一個(gè)批量處理的方法
// event: 事件實(shí)例
// span: EKSpanThisEvent->僅影響當(dāng)前事件 EKSpanFutureEvents->影響這個(gè)事件及其后的一切
// commit: NO 暫存當(dāng)前事件 但不提交到系統(tǒng)日歷 YES 立即提交存入系統(tǒng)日歷
// error: 保存處理過程中的錯(cuò)誤
// */
// [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];
// /*
// 上述func commit 設(shè)置NO時(shí) 會(huì)暫存 然后調(diào)用下面的commit才會(huì)提交到事件存儲(chǔ)區(qū)->系統(tǒng)日歷
// */
// NSError *commitErr;
// [eventStore commit:&commitErr];
}
});
}];
}
==>2.添加提醒:添加的提醒,在系統(tǒng)提醒事項(xiàng)中查看
//1.權(quán)限查看 用戶需要開啟權(quán)限才可操作
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.權(quán)限問題 無法進(jìn)行添加
if (error){
NSLog(@"添加失敗恋日,請(qǐng)稍后重試");
}else if (!granted){
NSLog(@"不允許使用日歷,請(qǐng)?jiān)谠O(shè)置中允許此App使用日歷");
}else{
//2-2.賦予權(quán)限 進(jìn)行下一步添加
//3.創(chuàng)建提醒實(shí)例 并進(jìn)行添加
EKReminder *reminder = [EKReminder reminderWithEventStore:eventStore];
//3-1.設(shè)置reminder 必要屬性
reminder.title = @"今天去看牙";//提醒的標(biāo)題
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;//預(yù)期完成提醒的日期
reminder.completed = NO;//設(shè)置YES將把實(shí)際完成的日期設(shè)置為當(dāng)前日期。
// reminder.completionDate //實(shí)際完成提醒的日期
reminder.priority = EKReminderPriorityHigh; //優(yōu)先級(jí)
//提醒所屬日歷
reminder.calendar = [eventStore defaultCalendarForNewReminders];
//添加鬧鈴
reminder.alarms = @[[EKAlarm alarmWithRelativeOffset:5],[EKAlarm alarmWithRelativeOffset:10]];
//4.保存提醒實(shí)例到提醒空間
NSError *error;
[eventStore saveReminder:reminder commit:YES error:&error];
/*
設(shè)置commit NO岂膳∈母停可以進(jìn)行批量處理
store 調(diào)用commit 進(jìn)行批量提交
*/
// NSError *commitError;
// [eventStore commit:&commitError];
NSLog(@"%@-%@",error,reminder);
}
});
}];
}
==>3.提取提醒/事件
//事件提取
//1.權(quán)限查看 用戶需要開啟權(quán)限才可操作
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.權(quán)限問題 無法進(jìn)行添加
if (error){
NSLog(@"添加失敗,請(qǐng)稍后重試");
}else if (!granted){
NSLog(@"不允許使用日歷,請(qǐng)?jiān)谠O(shè)置中允許此App使用日歷");
}else{
//2-2.賦予權(quán)限 進(jìn)行下一步添加
//3.提取事件
//這里謂詞 區(qū)間最大貌似是四年 設(shè)置的時(shí)候注意
//另外:提取事件的時(shí)候 只能通過這個(gè)來設(shè)置謂詞
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.權(quán)限查看 用戶需要開啟權(quán)限才可操作
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.權(quán)限問題 無法進(jìn)行添加
if (error){
NSLog(@"添加失敗谈截,請(qǐng)稍后重試");
}else if (!granted){
NSLog(@"不允許使用日歷,請(qǐng)?jiān)谠O(shè)置中允許此App使用日歷");
}else{
//2-2.賦予權(quán)限 進(jìn)行下一步添加
//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.幾個(gè)主要類
==>4-1 EKEventStore 訪問用戶日歷和提醒事件并支持新事件計(jì)劃的對(duì)象筷屡。
==>4-2 EKEvent 事件實(shí)例(設(shè)置相關(guān)信息 地理位置 鬧鐘提醒等)
==>4-3 EKReminder 提醒實(shí)例(設(shè)置相關(guān)信息 鬧鐘提醒等 這里地理信息沒法設(shè)置 但是在設(shè)置鬧鐘的實(shí)例中能進(jìn)行相關(guān)的設(shè)置)
==>4-4 EKAlarm 鬧鐘實(shí)例(先關(guān)設(shè)置 地理信息等)
==>4-5 EKRecurrenceRule 設(shè)置重復(fù)規(guī)則(日 周 月 年)
==>4-6 EKStructuredLocation 配置地理信息