EventKit掌管着日历事件和提醒事件两个App的信息
调用相关代码,需要在plist文件里添加item,如下图:
都通过EKEventStore进行访问
代码语言:javascript复制private var store: EKEventStore = EKEventStore() // 初始化和释放时间比较长,建议写成单例
一、日历事件的:增删改查
1、检查授权
代码语言:javascript复制// 1.检查授权
store.requestAccess(to: .event) { (granted, error) in
if granted { // 已授权
print("已授权")
self.inquireCalender() // 调用了查询事件方法
} else { // 未授权:需要request
print("未授权, 若需使用此功能,需要提醒用户去系统设置页面开启日历权限")
}
}
2、查询:使用 谓词 或者 identifier 查询
代码语言:javascript复制// MARK: 查询日历事件
func inquireCalender() {
// 1.使用谓词
let calendar = NSCalendar.current
// 开始时间
var startComponents = DateComponents()
startComponents.day = 0
let startDate:Date = calendar.date(byAdding: startComponents, to: Date()) ?? Date()
print("onDateAgo: (startDate)")
// 结束时间
var endComponents = DateComponents()
endComponents.month = 3
let endDate:Date = calendar.date(byAdding: endComponents, to: Date()) ?? Date()
print("onDateAgo: (endDate)")
// 参数calendars是一个calendar的集合,如果为nil,表示所有用户的calendars
let predicate = store.predicateForEvents(withStart: startDate, end: endDate, calendars: nil)
// 该方法为同步方法,最好放在工作线程里做
let events = store.events(matching: predicate)
print("events: (events)")
self.events = events
// 刷新tableview展示数据
DispatchQueue.main.async {
self.tableView.reloadData()
}
// 2.使用identifier获取
store.event(withIdentifier: "")
}
3、创建
代码语言:javascript复制// MARK: - 创建
@objc private func addCalendar() {
// 3.创建
let event = EKEvent(eventStore: store)
event.title = "私人课"
event.startDate = Date()
event.endDate = Date().addingTimeInterval(1000)
let alarm = EKAlarm(absoluteDate: Date().addingTimeInterval(500))
event.addAlarm(alarm)
event.calendar = store.defaultCalendarForNewEvents
do {
try store.save(event, span: .futureEvents, commit: true)
} catch {
print("save calendar error:(error)")
}
DispatchQueue.main.async { [weak self] in
self?.inquireCalender() // 重新查询,并刷新列表
}
}
4、删除
代码语言:javascript复制// 4.删除
let event: EKEvent = events![indexPath.row]
do {
try store.remove(event, span: .futureEvents, commit: true)
} catch {
print("remove error: (error)")
}
DispatchQueue.main.async { [weak self] in
self?.inquireCalender() // 重新查询,并刷新列表
}
5、修改
代码语言:javascript复制// 5.修改
let event: EKEvent = events![indexPath.row]
event.title = "修改后的 私人课~"
do {
try store.save(event, span: .futureEvents, commit: true)
} catch {
print("remove error: (error)")
}
DispatchQueue.main.async { [weak self] in
self?.inquireCalender() // 重新查询,并刷新列表
}
二、提醒事件的:增删改查
1、检查授权
代码语言:javascript复制// 1.检查授权
store.requestAccess(to: .reminder) { (granted, error) in
if granted { // 已授权
print("已授权")
self.inquireReminder()
} else { // 未授权:需要request
print("未授权, 若需使用此功能,需要提醒用户去系统设置页面开启提醒权限")
// TODO Alert
}
}
2、查询:使用 谓词 或 identifer 查找
代码语言:javascript复制// 1).使用谓词
// starting = nil 表示从最开始查找
// ending = nil 表示查找到最后
// 查找未完成的提醒
var predicate = store.predicateForIncompleteReminders(withDueDateStarting: nil, ending: nil, calendars: nil)
// 查找完成的提醒
predicate = store.predicateForCompletedReminders(withCompletionDateStarting: nil, ending: nil, calendars: nil)
// 查找所有提醒
predicate = store.predicateForReminders(in: nil)
store.fetchReminders(matching: predicate) { [weak self] (reminders) in
guard (reminders != nil) else {
return
}
self?.reminders = reminders
DispatchQueue.main.async {
self?.tableView.reloadData()
}
for reminder in reminders! {
// 与日历事件不同的是,该方法为异步回调,不需要另外开线程
// 如果想要停止获取的操作,return cancelFetchRequest
print("reminder: (reminder)")
print("alarm: (reminder.alarms?.first)")
}
}
// 2).使用identifer查找
store.calendarItem(withIdentifier: "")
3、创建
代码语言:javascript复制let reminder: EKReminder = EKReminder(eventStore: store)
reminder.calendar = store.defaultCalendarForNewReminders()
reminder.title = "提醒你哦~"
let alarm = EKAlarm(absoluteDate: Date(timeIntervalSinceNow: 20))
reminder.addAlarm(alarm)
do {
try store.save(reminder, commit: true)
} catch {
print("save reminder error: (error)")
}
DispatchQueue.main.async {
self.inquireReminder() // 重新查询,并刷新列表
}
4、修改
代码语言:javascript复制let reminder: EKReminder = reminders![indexPath.row]
reminder.title = "修改后的 提醒你哦~"
do {
try store.save(reminder, commit: true)
} catch {
print("remove error: (error)")
}
DispatchQueue.main.async {
self.inquireReminder() // 重新查询,并刷新列表
}
5、删除
代码语言:javascript复制let reminder: EKReminder = reminders![indexPath.row]
do {
try store.remove(reminder, commit: true)
} catch {
print("remove error: (error)")
}
DispatchQueue.main.async {
self.inquireReminder() // 重新查询,并刷新列表
}
github Demo地址