🐕

【Swift】EventKit RemindersAPI

2023/10/02に公開

EventKitフレームワークからAPIが提供されています。

この記事では、純正リマインダーアプリへのアクセス要求、新規リマインダーの追加について簡単に著したいと思います。

まずは事前準備です。
TargetのInfoに「Privacy - Reminders Full Access Usage Description」と「Privacy - Reminders Usage Description」の二つのKeyを追加します。前者はiOS17以降、後者はiOS17より前のものに対応するためです。Valueにはプロンプトが表示された際の文言を記述します。(蛇足になりますが、2023年10月2日時点でリマインダーへのアクセスはフルアクセスのみです。WriteOnlyはありません。)

フレームワークのインポートとEKEventStoreのインスタンスを作成します。

import EventKit
let store = EKEventStore()

リマインダーアプリへのアクセス要求を行います。
ここで二つの注意点があります。一つ目は、iOSバージョンに応じて、適切なメソッドを用いる必要があります。二つ目は、アクセス要求はダウンロード後の一度のみという点です。このときに許可をされなかった場合は、あとで許可を促しましょう。

if #available(iOS 17, *) { // iOS17以降
  store.requestFullAccessToReminders { result, error in
    print("result:", result, " / ", "error:", error as Any)
  }
} else { // iOS17以前
  store.requestAccess(to: .reminder) { result, error in
    print("result:", result, " / ", "error:", error as Any)
  }
}

新規リマインダーの追加を行います。ここでは、デフォルトに指定されているリストにリマインダーを追加します。

// リマインダーを新規作成
let reminder = EKReminder(eventStore: store)
 // タイトルを設定
reminder.title = "テスト"
// 追加先のリストを設定
reminder.calendar = store.defaultCalendarForNewReminders()
// リマインダーをリストに追加(コミット)
do {
    try store.save(reminder, commit: true)
    print("リマインダーの作成に成功しました。")
} catch {
    print("error:", error)
    print("リマインダーの作成に失敗しました。")
}

以上を踏まえ、SwiftUIにて簡単に実装をしてみたいと思います。もしiOS17より前のバージョンで試す際は、Minimum DeploymentでiOSの指定をお忘れなく。あくまでサンプルのため何かと粗がありますが、ご容赦くださいませ。


import SwiftUI
import EventKit

struct ContentView: View {
    private let store = EKEventStore()
    
    var body: some View {
        Button("アクセス要求") {
            if #available(iOS 17, *) { // iOS17以降
              store.requestFullAccessToReminders { result, error in
                print("result:", result, " / ", "error:", error as Any)
              }
            } else { // iOS17以前
              store.requestAccess(to: .reminder) { result, error in
                print("result:", result, " / ", "error:", error as Any)
              }
            }
        }
        
        Button("リマインダー作成") {
            // リマインダーを新規作成
            let reminder = EKReminder(eventStore: store)
             // タイトルを設定
            reminder.title = "テスト"
            // 追加先のリストを設定
            reminder.calendar = store.defaultCalendarForNewReminders()
            // リマインダーをリストに追加(コミット)
            do {
                try store.save(reminder, commit: true)
                print("リマインダーの作成に成功しました。")
            } catch {
                print("error:", error)
                print("リマインダーの作成に失敗しました。")
            }        }.padding(.top)
    }
}

今回は以上になります。閲覧ありがとうございました。もしよろしければX(旧Twitter)のフォローをお願いします。
https://twitter.com/3MB_JP

Discussion