系統(tǒng)日歷提醒事件獲取與添加

針對(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ù),它必須分別包括NSRemindersUsageDescriptionNSCalendarsUsageDescription
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 配置地理信息

2. EventKitUI UI界面搭建
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市傻盟,隨后出現(xiàn)的幾起案子速蕊,更是在濱河造成了極大的恐慌,老刑警劉巖娘赴,帶你破解...
    沈念sama閱讀 211,496評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件规哲,死亡現(xiàn)場離奇詭異,居然都是意外死亡诽表,警方通過查閱死者的電腦和手機(jī)唉锌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門隅肥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袄简,你說我怎么就攤上這事腥放。” “怎么了绿语?”我有些...
    開封第一講書人閱讀 157,091評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵秃症,是天一觀的道長。 經(jīng)常有香客問我吕粹,道長种柑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評(píng)論 1 283
  • 正文 為了忘掉前任匹耕,我火速辦了婚禮聚请,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稳其。我一直安慰自己驶赏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評(píng)論 6 385
  • 文/花漫 我一把揭開白布既鞠。 她就那樣靜靜地躺著煤傍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪损趋。 梳的紋絲不亂的頭發(fā)上患久,一...
    開封第一講書人閱讀 49,802評(píng)論 1 290
  • 那天椅寺,我揣著相機(jī)與錄音浑槽,去河邊找鬼。 笑死返帕,一個(gè)胖子當(dāng)著我的面吹牛桐玻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荆萤,決...
    沈念sama閱讀 38,945評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼镊靴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了链韭?” 一聲冷哼從身側(cè)響起偏竟,我...
    開封第一講書人閱讀 37,709評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敞峭,沒想到半個(gè)月后踊谋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旋讹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評(píng)論 2 327
  • 正文 我和宋清朗相戀三年殖蚕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轿衔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,637評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睦疫,死狀恐怖害驹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛤育,我是刑警寧澤宛官,帶...
    沈念sama閱讀 34,300評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站瓦糕,受9級(jí)特大地震影響摘刑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刻坊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評(píng)論 3 313
  • 文/蒙蒙 一枷恕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谭胚,春花似錦徐块、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旁趟,卻和暖如春昼激,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锡搜。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評(píng)論 1 266
  • 我被黑心中介騙來泰國打工橙困, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耕餐。 一個(gè)月前我還...
    沈念sama閱讀 46,344評(píng)論 2 360
  • 正文 我出身青樓凡傅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肠缔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夏跷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • #import <EventKit/EventKit.h>- (void)saveEvent:(id)sender...
    夭Y夭閱讀 5,299評(píng)論 1 4
  • 2017年11月4日。去的黃龍沃爾瑪下面的店明未。 點(diǎn)的麻辣罐罐米線槽华,挺有滋味的,可以免費(fèi)加一份米線趟妥,很多猫态,不加米線我...
    天使之城悅閱讀 272評(píng)論 0 0
  • 我一老叟入簡書, 為圓夢想步其途。 寫有文字三十萬懂鸵, 故事占去多篇幅偏螺。 題材多為身邊出, 加工提煉百態(tài)浮匆光。 他人褒...
    風(fēng)云翁閱讀 2,727評(píng)論 22 150
  • 關(guān)于愛情 從來沒有一顆 撞大運(yùn)的心 只愿 遇到的人 剛好在尋找自己 波瀾不驚 靜靜地 聽彼此的心 把世界 停留在彼...
    ClaireBear531閱讀 116評(píng)論 0 1