【iOS 17】Journaling Suggestions 入門

iOS 17.2からジャーナルアプリを使用することができるようになりました。ジャーナルアプリはユーザーのアクティビティ情報をレコメンドし、ジャーナルへの記入を提案してくれます。
ジャーナルアプリが使用可能になったと同時に、Journaling Suggestionsフレームワークがサードパーティ向けに解放されました。Journaling Suggestionsを使用することで、ユーザーのアクティビティ情報を活用したアプリを開発することができます。
本記事ではJournaling Suggestionsの基本的な概要と最小実装方法について書きます。最後まで記事をお読みいただくと、Journaling機能をご自身のアプリに導入することができるようになります。
Journaling Suggestionsとは
iOS 17.2以降で使用可能な写真、場所、ワークアウト、繰り返し再生した音楽といった、ユーザーのアクティビティ情報を提案してくれるフレームワークです。Journaling Suggestionsには、提案されたアクティビティ情報を取得するためのピッカーAPIが用意されており、Journaling Suggestionsが提案するアクティビティ情報をアプリで使用することができます。
Journaling Suggestionsが提案するアクティビティ情報は、機械学習を利用して自動的にレコメンドされます。
JournalingSuggestionsPicker
JournalingSuggestionsPicker を使用することで、Journaling Suggestionsが提案するアクティビティ情報を取得するためのピッカーを表示することができます。
init(label:onCompletion:) を使用してJournalingSuggestionsPicker のインスタンスを生成します。label 引数にはピッカーを表示するボタンに表示するラベルを、onCompletion 引数にはアクティビティ情報をピッカーで選択した後に実施する処理をJournalingSuggestion 型の引数を取るクロージャで指定します。
JournalingSuggestion 型の引数には、選択したアクティビティ情報が格納されています。
Suggestion Type
Journaling Suggestionsが提案するSuggestionにはタイプがあります。それぞれのタイプによって、取得することができるアクティビティ情報が異なります。
各Suggestionタイプの概要は以下になります。
| Suggestion type | 概要 |
|---|---|
| Contact | 電話やメッセージでコミュニケーションをとった人物の連絡先情報 |
| LivePhoto | 写真ライブラリ内のLive Photos情報 |
| Location | 訪れた町や訪問日情報 |
| LocationGroup | 訪れた複数の町や訪問日情報 |
| MotionActivity | 運動を行った時間の期間やステップ数情報 |
| Photo | 写真ライブラリ内の写真情報 |
| Podcast | 繰り返し再生したポッドキャスト情報 |
| Song | 繰り返し再生した楽曲情報 |
| Video | 写真ライブラリ内のビデオ情報 |
| Workout | 完了したワークアウト情報 |
| WorkoutGroup | 完了した複数のワークアウト情報 |
各Suggestionタイプで取得可能な情報は以下になります。
| Suggestion type | Contents |
|---|---|
| Contact | name: String, photo: URL? |
| LivePhoto | image: URL, video: URL, date: Date? |
| Location | city: String?, place: String?, location: CLLocation?, date: Date? |
| LocationGroup | locations: [Location] |
| MotionActivity | icon: URL?, date: DateInterval?, steps: Int |
| Photo | photo: URL, date: Date? |
| Podcast | show: String?, episode: String?, artwork: URL?, date: Date? |
| Song | song: String?, artist: String?, album: String?, artwork: URL?, date: Date? |
| Video | url: URL, date: Date? |
| Workout | icon: URL?, route: [CLLocation]?, details: Details?, Details |
| WorkoutGroup | icon: URL?, duration: TimeInterval?, activeEnergyBurned: HKQuantity?, averageHeartRate: HKQuantity?, workouts: [Workout] |
実装
Journaling Suggestionsエンタイトルメントの追加
アプリでJournaling機能を使用するためには、Journaling機能を使用したいXcodeプロジェクトにJournaling Suggestionsエンタイトルメントを追加する必要があります。
[Signing & Capabilities]から[+Capability]を選択し、Journaling Suggestionsを追加します。

JournalingSuggestionsピッカーボタンの表示
以下はJournalingSuggestionピッカーボタンを表示し、選択したSuggestionのタイトルを表示するサンプルコードです。

繰り返し再生したポッドキャストや楽曲がある場合は、複数のSuggestionが表示されます。

Suggestion詳細情報を取得する
JournalingSuggestionsPicker インスタンスを生成時に指定したクロージャ内のJournalingSuggestion 型の引数を使用して、Suggestion詳細情報を取得することができます。
以下のコードは、繰り返し再生した楽曲のSuggestion詳細情報を取得するコードです。
JournalingSuggestion のcontent を使用して、Suggestion詳細情報を取得しています。content のforType 引数には詳細情報を取得したいSuggestion type名を指定します。
suggestionSongData には[JournalingSuggestion.Song] 型のインスタンスが格納されます。[JournalingSuggestion.Song] 型インスタンスの各種プロパティに、楽曲のSuggestion詳細情報が格納されています。
今回は繰り返し再生した楽曲のSuggestion (SongタイプのSuggestion)詳細情報を取得しましたが、content のforType 引数を変更することで、他のSuggestionタイプの詳細情報も取得することができます。
全体コード
実行結果

参考資料
・Discover the Journaling Suggestions API
・Journaling Suggestions
Discussion