iOS/調(diào)用系統(tǒng)日歷和提醒事項時學(xué)到的東西

最近公司項目中有個地方需要將軟件的備忘錄同步到系統(tǒng)中,由系統(tǒng)來提醒,網(wǎng)上也有類似的例子,做了配置后日歷沒什么問題,但是提醒事項就不行,切斷點看原因

Error getting default calendar for new reminders

error=Error Domain=EKErrorDomain Code=1 "No calendar has been set." UserInfo

大體就是獲取提醒時出錯,然而看了好多中文網(wǎng)的例子都沒出現(xiàn)過這種錯誤,都是Error getting default calendar for newEvent 這種錯誤,然后我用了他們寫的demo也是運行不出來,我當時就在想難道都沒遇到過這種調(diào)用提醒事項出錯的么,其實大家心里都清楚,很多都是復(fù)制別人的博客,真正去敲代碼的很少,失望下去看國外的技術(shù)博客,外語水平一般,勉強能看懂,發(fā)現(xiàn)不少和我遇到類似的情況,不過他們解決的方式不一樣,總結(jié)如下:

一,不論要調(diào)取系統(tǒng)的相冊或者語音,或者日歷和提醒事項,那么都要在plist文件中進行設(shè)置

二,然后就是需要請求系統(tǒng)的權(quán)限,每一個都要請求

我就是在這步錯的,網(wǎng)上的一些人誤導(dǎo)了我,這里粘貼處別人的代碼,其中分割線中間的部分可以看到是請求的系統(tǒng)日歷權(quán)限,如果通過繼續(xù)保存,

+ (void)saveEventStartDate:(NSDate*)startData endDate:(NSDate*)endDate alarm:(float)alarm eventTitle:(NSString*)eventTitle location:(NSString*)location isReminder:(BOOL)isReminder{

//事件市場

EKEventStore *eventStore = [[EKEventStore alloc] init];

//6.0及以上通過下?面?方式寫?入事件

if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {

//等待用戶是否同意授權(quán)日歷

//EKEntityMaskEvent提醒事項參數(shù)(該參數(shù)只能真機使用)? EKEntityTypeEvent日歷時間提醒參數(shù)


[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {

dispatch_async(dispatch_get_main_queue(), ^{

if (error)

{

}else if (!granted)

{

//被?用戶拒絕,不允許訪問?日歷

}else{


//事件保存到?日歷

//創(chuàng)建事件

EKEvent *event = [EKEvent eventWithEventStore:eventStore];

event.title = eventTitle;

event.location = location;

//設(shè)定事件開始時間

//[NSDate dateWithTimeIntervalSinceNow:10];

event.startDate=startData;

//設(shè)定事件結(jié)束時間

//[NSDate dateWithTimeIntervalSinceNow:20];

event.endDate=endDate;

//添加提醒 可以添加多個轧邪,設(shè)定事件多久以前開始提醒

// event.allDay = YES;

//在事件前多少秒開始事件提醒-5.0f

[event addAlarm:[EKAlarm alarmWithRelativeOffset:alarm]];

[event setCalendar:[eventStore defaultCalendarForNewEvents]];

NSError *err;

[eventStore saveEvent:event span:EKSpanThisEvent error:&err];

NSLog(@"保存成功");

//是否寫入提醒事項褐澎,提醒事項為iOS原生自帶的,但是模擬器沒有的,這個地方說IOS原生自帶,看了10個博文幾乎都一模一樣,給人誤導(dǎo)不用請求提醒事項不用申請,這個地方也需要申請,我再下面自己的代碼里寫了申請?zhí)嵝咽马?如果直接用他的,在這個地方打斷點reminder.calendar=[eventStore defaultCalendarForNewReminders];會發(fā)現(xiàn)為空,因為沒去獲取系統(tǒng)的權(quán)限,那么調(diào)用defaultCalendarForNewReminders根本不行,雖然不會報錯

if (isReminder) {

EKCalendar * iDefaultCalendar = [eventStore defaultCalendarForNewReminders];

EKReminder *reminder=[EKReminder reminderWithEventStore:eventStore];

reminder.calendar=[eventStore defaultCalendarForNewReminders];

reminder.title=eventTitle;

reminder.calendar = iDefaultCalendar;

EKAlarm *alarm=[EKAlarm alarmWithAbsoluteDate:[NSDate dateWithTimeIntervalSinceNow:-10]];

[reminder addAlarm:alarm];

NSError *error=nil;

[eventStore saveReminder:reminder commit:YES error:&error];

if (error) {

NSLog(@"error=%@",error);

}

}

}

});

}];

}else{

//4.0和5.0通過下述?方式添加 無需判斷用戶是否同意訪問日歷

//事件保存到?日歷

//創(chuàng)建事件

EKEvent *event = [EKEvent eventWithEventStore:eventStore];

event.title = eventTitle;

event.location = location;

//設(shè)定事件開始時間

//[NSDate dateWithTimeIntervalSinceNow:10];

event.startDate=startData;

//設(shè)定事件結(jié)束時間

//[NSDate dateWithTimeIntervalSinceNow:20];

event.endDate=endDate;

//添加提醒 可以添加多個舔涎,設(shè)定事件多久以前開始提醒

// event.allDay = YES;

//在事件前多少秒開始事件提醒-5.0f

[event addAlarm:[EKAlarm alarmWithRelativeOffset:alarm]];

[event setCalendar:[eventStore defaultCalendarForNewEvents]];

NSError *err;

[eventStore saveEvent:event span:EKSpanThisEvent error:&err];

NSLog(@"保存成功");

//是否寫入提醒事項誊役,提醒事項為iOS原生自帶的获列,但是模擬器沒有的

if (isReminder) {

EKCalendar * iDefaultCalendar = [eventStore defaultCalendarForNewReminders];

EKReminder *reminder=[EKReminder reminderWithEventStore:eventStore];

reminder.calendar=[eventStore defaultCalendarForNewReminders];

reminder.title=eventTitle;

reminder.calendar = iDefaultCalendar;

EKAlarm *alarm=[EKAlarm alarmWithAbsoluteDate:[NSDate dateWithTimeIntervalSinceNow:-10]];

[reminder addAlarm:alarm];

NSError *error=nil;

[eventStore saveReminder:reminder commit:YES error:&error];

if (error) {

NSLog(@"error=%@",error);

}

}

}

}

以上都是我對別人的錯誤代碼進行的解析,下面我自己增加了一個方法用來增加的提醒事項,因為我只需要添加提醒事項部分,所以就只寫了調(diào)用提醒事項,日歷等同,上面的代碼也實現(xiàn)了日歷的調(diào)用,只不過沒實現(xiàn)提醒事項的.其實我的這部分就是抽出來了增加提醒事項的部分,并增加了申請系統(tǒng)提醒事項權(quán)限的代碼,沒多少.

data就是提醒時間,可以任意比如:

NSDate*startData=[NSDate dateWithTimeIntervalSinceNow:10];

title是提醒內(nèi)容

-(void)addReminderNotify:(NSDate *)date title:(NSString *)title

{

//事件市場

EKEventStore *eventStore = [[EKEventStore alloc] init];

//6.0及以上通過下?面?方式寫?入事件

if ([eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)]) {

//等待用戶是否同意授權(quán)日歷

//EKEntityMaskEvent提醒事項參數(shù)(該參數(shù)只能真機使用)? EKEntityTypeEvent日歷時間提醒參數(shù)

[eventStore requestAccessToEntityType:EKEntityTypeReminder completion:^(BOOL granted, NSError *error) {

dispatch_async(dispatch_get_main_queue(), ^{

if (error)

{

}else if (!granted)

{

//被?用戶拒絕,不允許訪問?日歷

}else{

//事件保存到?日歷

//創(chuàng)建事件

EKCalendar * iDefaultCalendar = [eventStore defaultCalendarForNewReminders];

EKReminder *reminder=[EKReminder reminderWithEventStore:eventStore];

reminder.title= title;

reminder.calendar = iDefaultCalendar;

EKAlarm *alarm=[EKAlarm alarmWithAbsoluteDate:date];

[reminder addAlarm:alarm];

EKCalendar *targetCalendar = nil;

if (eventStore.defaultCalendarForNewReminders == nil) {

EKEventStore? *eventStores = [[EKEventStore alloc] init];

targetCalendar = [eventStores defaultCalendarForNewReminders];

[reminder setCalendar:targetCalendar];

}else

{

[reminder setCalendar:[eventStore defaultCalendarForNewReminders]];

}

NSError *error=nil;

[eventStore saveReminder:reminder commit:YES error:&error];

if (error) {

NSLog(@"error=%@",error);

}

}

});

}];

}

}

我也是喜歡看別人的例子,懶得自己琢磨,希望我的經(jīng)歷可以給別人一些小提示.??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛔垢,隨后出現(xiàn)的幾起案子击孩,更是在濱河造成了極大的恐慌,老刑警劉巖鹏漆,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巩梢,死亡現(xiàn)場離奇詭異,居然都是意外死亡艺玲,警方通過查閱死者的電腦和手機括蝠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饭聚,“玉大人忌警,你說我怎么就攤上這事∶胧幔” “怎么了法绵?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酪碘。 經(jīng)常有香客問我朋譬,道長,這世上最難降的妖魔是什么兴垦? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任徙赢,我火速辦了婚禮,結(jié)果婚禮上探越,老公的妹妹穿的比我還像新娘狡赐。我一直安慰自己,他們只是感情好扶关,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布阴汇。 她就那樣靜靜地躺著,像睡著了一般节槐。 火紅的嫁衣襯著肌膚如雪搀庶。 梳的紋絲不亂的頭發(fā)上拐纱,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音哥倔,去河邊找鬼秸架。 笑死,一個胖子當著我的面吹牛咆蒿,可吹牛的內(nèi)容都是我干的东抹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼沃测,長吁一口氣:“原來是場噩夢啊……” “哼缭黔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒂破,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤馏谨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后附迷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惧互,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年喇伯,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊儡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡稻据,死狀恐怖艾猜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攀甚,我是刑警寧澤箩朴,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站秋度,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钱床。R本人自食惡果不足惜荚斯,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望查牌。 院中可真熱鬧事期,春花似錦、人聲如沸纸颜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胁孙。三九已至唠倦,卻和暖如春称鳞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稠鼻。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工冈止, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人候齿。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓熙暴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慌盯。 傳聞我的和親對象是個殘疾皇子周霉,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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