【SwiftUI】Widget_iOS14.0(Configtation Intent)の実装方法【CoreDataとの連携】

この記事では、SwiftUIでのWidget_iOS14.0のConfigtation Intentを利用した実装方法、そしてより実践的な利用方法としてCoreDataとの連携方法を紹介しています。

 

なおConfigtation Intentを利用しない実装方法は、こちらの記事で解説しています。

Configtation Intentを利用する実装方法でも必要となる、AppGroupの作成方法などはこちらの解説を参考にしてください。

関連記事

この記事では、SwiftUIでのWidget_iOS14.0の実装方法、そしてより実践的な利用方法としてCoreDataとの連携方法を紹介しています。 ◆動作検証環境・ローカル環境:mac Catalina[…]

【SwiftUI】Widget_iOS14.0の実装方法【CoreDataとの連携】

 

 

◆動作検証環境

・ローカル環境:mac Catalina
・XCode:12.1
・SwiftUI:2.0
・iOS:14.0
・Life Cycle:SwiftUI App

 

Widget機能を利用するには、まずホストとなるApp(Containing Appと呼んだりしますが、この記事ではホストAppとして説明しています)が必要となります。

 

通常の方法でプロジェクトを作成するか、Widget機能を利用するプロジェクトを開きます。

今回は以前の記事で紹介した、CoreDataを利用するプロジェクトの中で、Widgetを追加します。

対象のプロジェクトはこちらの記事を参考にしてください。

関連記事

この記事では、SwiftUIでのCoreData の基本的な実装方法【CRUD(作成、更新、削除)】を紹介しています。簡単なタスク管理App(タスク内容とスケジュールの登録)を作成しながら解説します。 ◆動[…]

【SwiftUI】CoreData の基本的な実装方法【CRUD(作成、更新、削除)】

 

Configtation Intentを利用する場合、Targetの新規作成の際に、Include Configtation Intentにチェックを入れます。

Configtation Intentを利用する場合、Targetの新規作成の際に、Include Configtation Intentにチェックを入れます。

 

Widget_iOS14.0(Configtation Intent)の実装方法【Widgetの表示確認】

 

Widgetの追加を行ったら、ホーム画面でWidgetの表示確認を行います。

ビルドするターゲットが追加したWidgetになっている事を確認し、ビルドします。

 

デフォルトのコードでは、Configtation Intentを利用しない場合と同様に時刻が表示されますが、Widgetを長押しすると編集用のボタンが表示されます。

デフォルトのコードでは、Configtation Intentを利用しない場合と同様に時刻が表示されますが、Widgetを長押しすると編集用のボタンが表示されます。

 

こちらをタップすると、データをより詳細に表示するなどの機能を実装できます(デフォルトの状態では編集画面が表示されるだけです)。

こちらをタップすると、データをより詳細に表示するなどの機能を実装できます(デフォルトの状態では編集画面が表示されるだけです)。

 

デフォルトのWidgetのファイル(この記事のサンプルではTestIntentWidget.swift)のデフォルトのコードは以下のとおりです。

 

Widget_iOS14.0(Configtation Intent)の実装方法【WidgetとCoreDataの連携】

 

Configtation Intentを利用するWidgetとCoreDataを連携させるには、AppGroupを利用します。

詳しくは、以前の記事を参考にしてください。

【SwiftUI】Widget_iOS14.0の実装方法【CoreDataとの連携】

 

今回は、CoreDataに登録されているTaskの各データをWidgetに表示し、それぞれのデータを選択するとホストAppの詳細画面に遷移する方法を解説します(通常はWidgetをタップするとホストAppのホームViewへ遷移する)。

 

ホストAppの編集

上記の動きに対応するために、ホストAppを以下のように編集します。

  1. CoreData内のTaskエンティティにユニークな情報(UUID)の追加
  2. 詳細画面表示の実装

 

スポンサードリンク

CoreData内のTaskエンティティにユニークな情報(UUID)の追加

CoreDataTest.xcdatamodeld を開き、AttributesにUUID 型のid を追加します。

CoreDataTest.xcdatamodeld を開き、AttributesにUUID 型のid を追加します。

 

CoreDataのUUID型のidの場合、データが新規に追加されても、オートインクリメントでidが追加されません。

そのため、データ書き込み時にUUID型idを追加する処理を加えます。

データ書き込みのメソッドがあるViewModel.swift を編集します。

 

ViewModel.swift

 

詳細画面表示の実装

まずは、詳細画面Viewの作成

DetailView.swift

 

 

次に、ContentView.swiftにHomeViewから詳細Viewへ遷移させるコードを追加します。

ContentView.swift

 

WidgetExtensionの編集

CoreDataのデータをWidgetでも利用できるように、下記のように編集します。

CoreDataのタスクをWidgetに表示します。

 

TestIntentWidget.swift

 

これでWidgetが下記のように表示されるようになります。

これでWidgetが下記のように表示されるようになります。

 

 

Widget_iOS14.0(Configtation Intent)の実装方法【Widget編集画面の編集】

 

Widgetを長押しした際の編集画面で、登録しているタスクのデータ一覧を表示させ、それぞれをタップするとホストAppの詳細画面へ遷移するように編集します。

Widget機能を追加した際にフォルダ内に作成されている.intentdefinition ファイルを編集します。

 

デフォルトの状態は以下のようなコードになっています。

TestIntentWidget.intentdefinition

TestIntentWidget.intentdefinition

 

Widgetの編集画面を開いた際に、登録されているCoreDataのidの一覧が表示されるように、このファイルを編集します。

Options are provided dynamicallyにチェックを入れる事で、対象の値から選択できるようになります。

Widgetの編集画面を開いた際に、登録されているCoreDataのidの一覧が表示されるように、このファイルを編集します。

 

この状態でWidgetを長押しすると、編集内容が反映されています。

この状態でWidgetを長押しすると、編集内容が反映されています。

 

しかし、UUIDのボタンをタップしても下記のようにメッセージが表示され利用できません。

しかし、UUIDのボタンをタップしても下記のようにメッセージが表示され利用できません。

 

Intens機能の追加

新規Target追加から[Intents Extension]を選択します。

 

次に、Product Nameを記入し作成します。

次に、Product Nameを記入し作成します。

 

次に作成したIntentのTargetページで編集を行います。

[General] – [Supported Intents]にConfigurationIntent のclass Nameを追加します。AuthenticationはNoneのままでOKです。

 

作成したclassを確認するには、作成したIntentフォルダ内のinfo.plistを確認します。

[NSExtension] – [NSExtensionAttributes] – [intentsSupported] – [Item 0]のValuで確認できはずです。

 

この作業を行わないと、

Unable To Install CoreDataTest のようなエラーメッセージが表示され、ビルドできません。

 

これでTestIntents フォルダが作成されます。

その中にあるIntentHandler.swift を以下のように編集します。

 

まずは、ホストAppのCoreDataに関係するファイルのTargetを確認します。

新たに作成された、TestIntents もTargetに追加します。

 

IntentHandler クラスを作成して下記のように編集します。
 

このように、ConfigurationIntentHandling を継承させると、下記のように.intentdefinition の内容に応じXCodeから候補が出させるので、[Fix]します。

Type 'IntentHandler' does not conform to protocol 'ConfigurationIntentHandling' Do you want to add protocol stubs?

 

本記事の内容では、以下のようなコードとなります。

 

さらに作成されたメソッドの中に、CoreDataのデータを利用できるように編集を行います。

 

これで、Widgetを確認すると以下のように、CoreDataに登録されているUUIDの一覧が確認できるようになります。

これで、Widgetを確認すると以下のように、CoreDataに登録されているUUIDの一覧が確認できるようになります。

 

 

Widget_iOS14.0(Configtation Intent)の実装方法【WidgetからホストAppの詳細画面への遷移】

 

WidgetからホストAppの詳細画面に遷移させるには、DeepLink機能を利用します。

DeepLink機能のおおまかな流れは、

  1. Widgetの編集画面で選択したボタンでWidgetURLを選択する
  2. ホストAppでonOpenURLが呼ばれて対象のページへ遷移する

となります。

 

Widget側の編集

 

まず、TestIntentWidgetType.swift を作成し、TestIntentWidgetType プロトコルの中でURLを選択するためのメソッドを作ります。

TestIntentWidgetType.swift

 

これで、CoreData内のそれぞれのデータに、CoreDataTest://detail?id=xxxxxxxxxxxxxx というようにURLを指定できます。

TargetMembershipでWidgetを追加もします。

 

続いて、TestIntentWidget.swift の編集です。

struct TestIntentWidgetEntryView の部分を以下のように編集します。

 

ホストApp側の編集

ViewModelの編集

以下のコードをViewModel に追加します。

 

 

次に、ホストAppでデータ一覧表示から詳細画面へ遷移する際のNavigationLink を編集します。

というように、tag 、selection を追加します。

 

そして、NavigationLink のあるViewにonOpenURL でViewModelで作ったapply メソッドを使ってモディファイアします。

 

これで、Widgetをタップすると、CoreDataの1番目のデータの詳細画面に遷移するようになります。

 

ここまでの編集を行い、ContentView.swiftの全コードは以下のようになっております。

 

Widgetの編集

Widgetに表示されているデータの詳細画面に遷移できるようになりましたが、現在のコードではdate 順で一番上のデータが常に表示されるようになっていますので、Widgetの編集画面で選択したデータをWidgetで表示、詳細画面へ遷移できるように、下記のように編集します。

request.predicate = NSPredicate(format: "id == %@", UUID(uuidString:(configuration.UUID!))! as CVarArg) として、リクエストの条件をidでの一致としています。
 

次に編集画面の表示を修正します。

現在は、UUIDが表示されており、データの内容がわかりません。

UUIDがDeepLinkで利用するので、この値を保持しながらタスクの内容を表示するために、.intentdefinition を編集します。

 

TYPESの追加

カスタムTYPESを利用するために新規で作成します。

 

TYPE名をItemとして作成、その他設定はデフォルトのままです。

 

ConfigurationのTypeを作成したItemに指定します。

 

次にこの設定で修正が必要なコードを編集します。

IntentHandler.swift

 

TestIntentWidget.swift

 

これでUUIDを利用しながら、Taskを表示する設定となりました。

お疲れ様でした。


 

以上、SwiftUIでのWidget_iOS14.0のConfigtation Intentを利用した実装方法、そしてより実践的な利用方法としてCoreDataとの連携方法を紹介しました。