1 读取系统日历html
let eventStore = EKEventStore() let tempFormatter = NSDateFormatter() tempFormatter.dateFormat = "dd.MM.yyyy HH:mm" //获取一个时间段中的日历事件 let startDate = tempFormatter.dateFromString("10.08.2016 15:10")! let endDate = tempFormatter.dateFromString("12.08.2016 15:30")! let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: [eventStore.defaultCalendarForNewEvents]) //获取这个时间段中的全部日程 let events = eventStore.eventsMatchingPredicate(predicate)
2 添加事件到系统日历ios
let eventStore = EKEventStore()
eventStore.requestAccessToEntityType(.Event) { (granted, error) in dispatch_async(dispatch_get_main_queue(), { if error != nil { //发生错误 } else if !granted { //不容许访问日历 } else { //建立事件 let event = EKEvent(eventStore: eventStore) event.title = "lallallallal" let tempFormatter = NSDateFormatter() tempFormatter.dateFormat = "dd.MM.yyyy HH:mm" //建立一个时间段的日历事件 event.startDate = tempFormatter.dateFromString("11.08.2016 15:20")! event.endDate = tempFormatter.dateFromString("11.08.2016 15:30")! //设置是否为全天事件 event.allDay = false //设置事件的提醒时间(相对时间)提早15分钟提醒 event.addAlarm(EKAlarm(relativeOffset: -60.0 * 15.0)) //设置事件的提醒时间(绝对时间) //event.addAlarm(EKAlarm(absoluteDate: NSDate(timeInterval: -60 * 15, sinceDate: event.startDate))) event.calendar = eventStore.defaultCalendarForNewEvents //保存事件,添加到日历中 do { try eventStore.saveEvent(event, span: .ThisEvent, commit: true) } catch { } } }) }
3 分析:数据库
日历分为两类,一类用于存储事件的日历,一类用于存储提醒的日历。数组
EventKit库框架受权访问用户的日历app及提醒事项app。尽管是用两个不一样的应用来显示用户的日历和提醒数据,但倒是同一个框架来维护这份数据。一样地,存储这份数据的数据库叫作日历数据库,同时容纳日历和提醒信息。app
事件库不但容许你的应用获取用户已经存在的日历及提醒数据,并且它可让你的应用为任何日历建立新的事件和提醒。另外,事件库让用户能够编辑和删除他们的事件和提醒(总体叫作“日历项”)。若是日历数据库有来自你的应用外部的更改发生,事件库能够经过通知监测到,这样你的应用能够作出适当的响应。使用事件库对日历项所作的更改会自动地同步到相关的日历。框架
(1)读写日历数据库异步
你可使用 EKEventStore
类从用户的日历数据库中获取、建立、编辑和删除事件。你能够获取匹配你提供的谓词的事件自定义的一组事件,或经过惟一标识获取一个单独的事件。你获取到一个事件后,可使用 EKEvent
类的属性获取访问该事件相关的日历信息。一样的,你能够经过设置 EKEvent
类的属性来修改该事件的日历信息。 async
let eventStore = EKEventStore()
在 iOS 6 及之后版本,你必须在事件库初始化后,使用 requestAccessToEntityType:completion:
方法请求使用用户的日历数据库。请求访问某个实体类型会异步提示用户容许或禁止你的应用使用他们的日历信息。你应该处理用户受权或禁止你的应用访问权的各类情况:函数
eventStore.requestAccessToEntityType(.Event) { (granted, error) in
}
EKEventStore
对象须要相对较大量的时间来初始化和释放。所以,你不该该为每个事件相关的任务都初始化和释放事件库。相反,在你的应用加载时,初始化一个事件库,而后反复地使用这一个来确保链接一直可用。事件库实例不该该在其它事件开发包相对的对象释放前被释放,不然可能发生意想不到的状态。ui
EKEvent
对象的数组,能够在数组上调用 sortedArrayUsingSelector:
方法,并提供 compareStartDateWithEvent:
方法的选择器。EKEventStore 的 eventsMatchingPredicate:
方法获取属于你提供的谓词中指定的日期范围的全部事件。
eventsMatchingPredicate:
方法接受一个 NSPredicate
类型的参数,但你必须提供一个用 EKEventStore
的方法 predicateForEventsWithStartDate:endDate:calendars:
建立的谓词。
你能够指定一个日历的子集来搜索,这须要传递一个 EKCalendar
对象的数组做为 predicateForEventsWithStartDate:endDate:calendars:
方法的 calendars 参数。你能够从事件库的 calendarsForEntityType:
方法得到用户的不一样类型的日历。若是传一个 nil 值,那么就是告诉这个方法获取用户的全部日历。
由于方法 eventsMatchingPredicate:
是同步的,而你可能并不想在你的应用主线程中运行它。若是要异步执行的话,那么使用 dispatch_async
函数或使用一个 NSOperation
对象,就能够在另外一个线程中运行该方法了。
EKEventStore
的 eventWithIdentifier:
方法来再次获取该事件。若是它是一个循环事件,那么这个方法就会返回第一次出现的该事件。你可使用属性 eventIdentifier
得到事件的惟一标识。EKEvent
的eventWithEventStore: 方法建立一个新的事件。提示:若是你的应用修改用户的日历数据库,它必须在这以前先从用户得到确认。应用在未获得用户的特定指示的状况下决不可能修改日历数据库。
你对事件的修改不是持久化的,直到你保存它们为止。使用 EKEventStore
的 saveEvent:span:commit:error: 方法保存你的修改到日历数据库中。若是你要从日历数据库移除事件,使用 EKEventStore 的 removeEvent:span:commit:error: 方法。不管你保存或移除事件,各自实现的方法都会自动所作的修改到该事件所属于的日历(CalDav、Exchange等等)。
若是你保存一个循环事件,你能够经过给 saveEvent:span:commit:error:
方法的参数 span 指定 EKSpanFutureEvents
来使你的更改应用到全部将来出现的该事件中。一样地,你也能够指定 removeEvent:span:commit:error:
方法的 span 参数值为 EKSpanFutureEvents
来移除一个事件的全部将来的出现。
注意:若是你给 commit 参数传了 NO 值,那么要确保稍侯调用 commit:
方法以持久保存你的更改(译者注:默认传 YES 会当即持久保存更改)。