在iOS设备系统自带日历中添加事件(Swift实现)

前几天公司团建,为了提前办理值机,我安装了同事推荐的航旅纵横App,发现了一个很不错的功能。为了方便提醒乘客,这个App把乘坐航班的信息添加到了事件提醒中:
MacDown Screenshot

个人觉得这个功能做的十分人性化,但自己从来没有做过,于是兴趣大发。可查找了网上资料,确实寥寥无几,大多是英文资料。于是自己开始查看文档,现记录使用方法。
Apple将添加事件的相关方法封装在EventKit.framework中,另外值得注意的是我们所调用的系统日历的UI是放在EventKitUI.framework中,所以,我们要首先导入如下两个framework:

1
2
import EventKit
import EventKitUI

首先,我们在操作系统日历时所必需使用的一个类EKEventStore,在文档中这样描述:

1
2
@discussion The EKEventStore class is the main point of contact for accessing Calendar data. You must
create a EKEventStore object in order to retrieve/add/delete events or reminders from the Calendar database.

大概意思是EKEventStore是操作Calendar的一个重点,在你要对Calendar数据库进行 查/增/删 等操作时候,你就必须要先实例化一个 EKEventStore对象。 EKEventStore的主要作用有以下几点:

  • 询问用户访问Calendar权限
  • 设置添加事件的类型(新事件/新提醒)
  • 操作Event(增加/查询/删除等)

好了,话不多说,先看看如何在Calendar上添加一个新事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
let eventStore = EKEventStore()
// 获取Clendar权限
eventStore.requestAccessToEntityType(.Event) { (granted, error) -> Void in
if error != nil {
// 错误处理
} else if !granted {
// 用户拒绝
} else {
/// 获取权限成功
// 设置事件类型
let calendar = eventStore.defaultCalendarForNewEvents
let event = EKEvent(eventStore: eventStore)
event.calendar = calendar
// 设置标题
event.title = "测试一下"
// 设置内容
event.notes = "salkgelgjigpwkh45kp"
// 开始时间
event.startDate = NSDate().dateByAddingTimeInterval(5)
// 结束时间
event.endDate = NSDate().dateByAddingTimeInterval(40)
// 添加提醒
let alarmOffset: Double = -1*60*60
let alarm = EKAlarm(relativeOffset: alarmOffset)
event.addAlarm(alarm)
let eventEditVC = EKEventEditViewController()
eventEditVC.event = event
eventEditVC.eventStore = eventStore
eventEditVC.editViewDelegate = self
self.navigationController!.presentViewController(eventEditVC, animated: true, completion: nil)
}
}

效果如下:

MacDown Screenshot