1、导入 EventKit
2、创建EKEventStore对象
该对象创建和销毁的时候和耗时间,而且在和Event相关的属性释放前释放的时候,可能出现不可预知的BUG,所以在使用的时候,推荐使用单例
3、监测授权,请求授权
4、读取事件数据
- 创建谓词 (谓词的时间间隔,最大为4年)
- 通过谓词匹配时间(同步的)
5、增删处理
6、简单的代码
import Foundation
import EventKit
class CalendarEventManager {
static let manager = CalendarEventManager()
static var isAuthorized: Bool {
return EKEventStore.authorizationStatus(for: .event) == .authorized
}
private let store = EKEventStore()
func saveEvent(_ event: EKEvent) -> Bool {
var rst = true
do {
try store.save(event, span: .thisEvent)
} catch {
rst = false
}
return rst
}
func removeEvent(_ event: EKEvent) -> Bool {
var rst = true
do {
try store.remove(event, span: .thisEvent)
} catch {
rst = false
}
return rst
}
func requestAnthorized(completion: @escaping (Bool, Error?) -> Void) {
store.requestAccess(to: .event, completion: completion)
}
func loadEvents(withStart: Date, end: Date, completion: @escaping ([EKEvent]) -> Void) {
let predicate = store.predicateForEvents(withStart: withStart, end: end, calendars: [store.defaultCalendarForNewEvents])
DispatchQueue.global().async {
let events = self.store.events(matching: predicate)
DispatchQueue.main.async {
completion(events)
}
}
}
}
7、内置UI展示,编辑ViewController
- 导入 EKEventUIKit
- 创建,展示就行了
8、一些思考
- 模拟器打印的EventStore中Calendars 发现有三个Calendar,默认使用的是Calendar。
- 暂时没有想到如何区分是本应用创建的时间
- EKEvent这个类,可以继承,但是没法继承构造方法,所有传入不了EventStore。继承是没有效果的。