📝
EventKitのリマインダーを試す
EventKit
EventKit
はカレンダー・リマインダーのAPIを提供するフレームワークです。カレンダーにイベントを追加したり、リマインダーに項目を追加したりできます。歴史は古く、iOS6からはほとんど変更はありません。
今回調べたきっかけは、自分が作りたいアプリのデータベースとしてリマインダーを流用できないかと考えたことです。
結果として使用しないことになりましたが、一通り調べたのでまとめました。
ここでは、リマインダーを中心に説明します。
使い方
主に次のようなフローになります
- 権限をリクエスト(カレンダー・リマインダーにアクセスする)
- リマインダーから項目を取得
- 項目の作成・保存・削除
権限をリクエスト
カレンダー・リマインダーを使用するためには、Info.plist
にキーを追加し、リクエスト処理を行います。
Info.plistにキーを追加
以下のキーを追加します。(追加されていない場合、アプリがクラッシュします)
- NSCalendarsUsageDescription: カレンダーを使う場合
- NSRemindersUsageDescription: リマインダーを使う場合
- NSContactsUsageDescription: カレンダーUI(EventKit UI)を使う場合
リクエスト処理
リマインダー使用のリクエストを行います。
let store = EKEventStore()
store.requestAccess(to: .reminder) { granted, error in
}
項目の取得
リマインダーの項目を取得するためには大きく分けて2通りあります
- 全て取得する
- リスト(EKCalendar)を指定して取得する
全て取得する
let predicate = store.predicateForReminders(in: nil)
store.fetchReminders(matching: predicate) { reminders in
}
リストを指定して取得する
リマインダーのリストはEKCalendar
クラスに当たります。
//全てのリストを取得
let calendars = store.calendars(for: .reminder)
//1つリストを選択します
let calendar = calendars.first!
//もしくはリストを作成します
let calendar = EKCalendar(for: .reminder, eventStore: store)
let source = store.sources.first(where: { $0.sourceType == .calDAV })!
calendar.title = "Title"
calendar.source = source
do {
try store.saveCalendar(calendar, commit: true)
} catch let error {
debugPrint(error)
}
リストを指定して取得します。
let predicate = store.predicateForReminders(in: [calendar])
store.fetchReminders(matching: predicate) { reminders in
}
リマインダーの追加と保存
let reminder = EKReminder(eventStore: store)
reminder.title = "Item"
reminder.calendar = calendar
reminder.notes = "Memo"
do {
try store.save(reminder, commit: true)
} catch let error {
}
リマインダーの削除
do {
try store.remove(reminder, commit: true)
} catch let error {
}
データの同期
データの同期に関連するEKEventStore
の機能です。
- commit: データを保存
- reset: ローカルのみの変更を破棄する
- refreshSourcesIfNecessary: 最新の情報をリモートから取得します。他の端末で変更した時など。
Discussion