EventKit掌管着日曆事件和提醒事件兩個App的信息
調用相關代碼,需要在plist文件裏添加item,如下圖:
都通過EKEventStore進行訪問
private var store: EKEventStore = EKEventStore() // 初始化和釋放時間比較長,建議寫成單例
一、日曆事件的:增刪改查
1、檢查授權
// 1.檢查授權
store.requestAccess(to: .event) { (granted, error) in
if granted { // 已授權
print("已授權")
self.inquireCalender() // 調用了查詢事件方法
} else { // 未授權:需要request
print("未授權, 若需使用此功能,需要提醒用戶去系統設置頁面開啓日曆權限")
}
}
2、查詢:使用 謂詞 或者 identifier 查詢
// 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、創建
// 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、刪除
// 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、修改
// 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、檢查授權
// 1.檢查授權
store.requestAccess(to: .reminder) { (granted, error) in
if granted { // 已授權
print("已授權")
self.inquireReminder()
} else { // 未授權:需要request
print("未授權, 若需使用此功能,需要提醒用戶去系統設置頁面開啓提醒權限")
// TODO Alert
}
}
2、查詢:使用 謂詞 或 identifer 查找
// 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、創建
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、修改
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、刪除
let reminder: EKReminder = reminders![indexPath.row]
do {
try store.remove(reminder, commit: true)
} catch {
print("remove error: \(error)")
}
DispatchQueue.main.async {
self.inquireReminder() // 重新查詢,並刷新列表
}
Demo地址:https://github.com/moxiaohui/survey2019/tree/master/08_EventKit