🐕
【Swift】EventKit RemindersAPI
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)のフォローをお願いします。
Discussion