向日历中写入事件(EventKit)

540 阅读1分钟
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。继承是没有效果的。