系统日历提醒事件获取与添加

2019-05-14  本文已影响0人  ghost__

针对系统日历相关提醒/事件的处理,iOS提供了两个库
EventKit:该框架提供了对用户日历数据库相关操作的API
EventKitUI:该框架提供了用于显示和编辑日历事件的视图控制器
官方的介绍可以看看,==》官方介绍

重要提示: iOS 10.0上或之后链接的iOS应用必须在其Info.plist文件中包含其需要访问的数据类型的使用说明密钥,否则将崩溃。要专门访问提醒和日历数据,它必须分别包括NSRemindersUsageDescriptionNSCalendarsUsageDescription
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 配置地理信息

2. EventKitUI UI界面搭建
上一篇下一篇

猜你喜欢

热点阅读