美文网首页
系统日历提醒事件获取与添加

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

作者: ghost__ | 来源:发表于2019-05-14 17:06 被阅读0次

    针对系统日历相关提醒/事件的处理,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界面搭建

    相关文章

      网友评论

          本文标题:系统日历提醒事件获取与添加

          本文链接:https://www.haomeiwen.com/subject/osdaoqtx.html