📝

EventKitのリマインダーを試す

2021/08/23に公開

EventKit

EventKitはカレンダー・リマインダーのAPIを提供するフレームワークです。カレンダーにイベントを追加したり、リマインダーに項目を追加したりできます。歴史は古く、iOS6からはほとんど変更はありません。
https://developer.apple.com/documentation/eventkit

今回調べたきっかけは、自分が作りたいアプリのデータベースとしてリマインダーを流用できないかと考えたことです。
結果として使用しないことになりましたが、一通り調べたのでまとめました。

ここでは、リマインダーを中心に説明します。

使い方

主に次のようなフローになります

  • 権限をリクエスト(カレンダー・リマインダーにアクセスする)
  • リマインダーから項目を取得
  • 項目の作成・保存・削除

権限をリクエスト

カレンダー・リマインダーを使用するためには、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