ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
インテントの強化
Appでインテントを作成すると、それをショートカットの一部として使用したり、Siriに頼むことで、ユーザーがタスクを素早く達成する助けになります。SiriKitのIn-Appインテントハンドリングを使い、より簡単にSiriに対応させる方法、 既存のインテントApp Extensionを使いSiriのパフォーマンスを向上させる方法もお伝えします。リッチな対話体験のために画像やサブタイトルを付けるなど、アクションを伴う体験をより良くするSiriKitの機能の活用方法もお伝えします。また、コードベース内でインテントの対応を調整する方法を確認し、作業をしやすくしましょう。
リソース
- Providing Hands-Free App Control with Intents
- Soup Chef: Accelerating App Interactions with Shortcuts
関連ビデオ
WWDC20
-
ダウンロード
こんにちは ようこそWWDCへ
“あなたのインテントに力を与える” こんにちは ご視聴ありがとうございます Appleの ショートカットエンジニアの ローマンです
本日は いくつかの技法と戦略について 共有させていただきます Siriの効果的な実装とアプリケーションへの ショートカットサポートに関するものです 最初に SiriKitの新しいAPIについて見てみましょう 次にアプリケーションの中でカスタマイズされた インテントを微調整する方法を見ていきます
では概要から始めましょう SiriKitは インテントとIntents UIの フレームワークを包含しており サービスをSiri ショートカットやマップと 統合するために使用されます iOS 14では ウィジェットにインテントを使い 構成やインテリジェンスを加えることができます Intents UI App Extensionは Intents App Extensionが ユーザのリクエストを満たした後 Siri ショートカット またはマップの インターフェイスにカスタムUIを表示します Intents App Extensionは SiriKitからのユーザの要求を受け アプリケーション特有のアクションに変えます メッセージを送ったり 音楽を再生したり 現在のお天気情報を得たり スープを注文するなどのアクションです
SiriKitは 人間が行う一般的なタスクを表す 多数のシステムインテントを定義しています Siriは システムインテントのため 対話フローを定義し その間 アプリケーションが そのやり取りを 完了するためのデータを提供します アプリケーションで どのSirikit ドメインにも収まらない日常的なタスクを 実行できるようにする場合は それを表すために カスタムインテントを作ることができます
Intents Extensionのジョブは 特定のインテントを処理するために使われる― handlerオブジェクトを SiriKitに提供することです これらのオブジェクトをExtensionの handlerForIntentメソッドから提供します 1つのインテントを処理する ライフサイクルを見てみましょう ユーザがインテントとやり取りするたびに 解決 確認 処理のどの段階でも― Intent Handlerは 要求を完了するのに10秒かかります 10秒のタイムアウトは ユーザの要求が Extensionへの接続を開始してすぐに始まります
この際 Extensionが起動していなければ システムにより起動されます Extensionが起動するのにかかる時間は プロセスがリンクを張っている すべてのフレームワークをロードする時間と―
プロセスやリンクしているフレームワークに 含まれている+load や静的イニシャライザを 実行するのにかかる時間に依存します
Extensionでは ビジネスロジックを 実行するための時間も必要になります
そのため Extensionが本当に必要な フレームワークのみをリンクするようにして 起動時に最適化することが重要です なぜなら フレームワークへのすべての リンクをロードするのにかかる時間は 10秒のタイムアウトに向けて 加算されるからです 1つの要求を処理するのにかかる時間もまた アプリケーションとのやり取りを いかに理解できるか という点に対して 影響を与えます Siriとのやり取りは 速さと手軽さを意識しており Intent Handlerが動いている間 ユーザを待たせることは避けなければなりません
10秒はかなり長いようです ほとんどのケースにおいて Intents Extensionでは アプリケーションがリンクするすべての フレームワークをリンクする必要がないため インポートするシンボルの数を 最小限に抑えることができます Intents Extensionのもう1つの特徴は モジュール方式であることです 1つのアプリケーションよりも 少ないメモリ 容量で独立して処理を走らせることができます
しかし Extensionを使うことが いつも可能で便利だとは限りません iOS 14では アプリケーション内での インテント処理を導入しました これで アプリケーションに Intent Handlerを追加し 解決 確認 処理のようなSiriKitの要求を 処理できるようになりました
アプリケーションとExtensionのどちらで インテントを処理するかを決めるのに役立つ― いくつかのよいユースケースについて お話ししましょう
メディア再生の開始や制御 ワークアウトの開始は 以前はIntents Extensionで解決と確認を行い アプリケーションで処理する必要がありました 今はアプリケーションのプロセスで 完全に行う方が効率的です
インテントの処理がアプリケーションの ユーザーインターフェースに影響を与える場合 アプリケーション内インテントの 処理にも適しています
アプリケーション内でのインテント処理は これまでExtensionのメモリ制約のため 不可能だった 写真や動画の処理など 新しいユースケースの可能性を生み出しました
正直なところ アプリケーションの構造によっては Intents Extensionや共有フレームワークに コードを組み込むことができない場合もあります しかし アプリケーションの 起動時間を念頭に置いてください 先ほど話した通り 10秒のタイムアウトがかかるからです
Intent Handlerを設計する際には どのインテントをIntents Extensionで 処理する必要があり どのインテントをアプリケーションに 移動できるかを 評価する必要があります
アプリケーション内のインテント処理の サポートを実装する方法を見てみましょう
まず アプリケーションが複数の ウィンドウをサポートし UISceneの ライフサイクルを採用しているか 確認する必要があります SiriKitのリクエストに応答して アプリケーションが起動されると アプリケーションに接続されている UISceneオブジェクトがない状態で起動されます 次に アプリケーションのターゲットの Supported Intentsセクションで アプリケーションの内部で処理したいすべての インテントをリストアップする必要があります 最後に アプリケーションのデリゲートの中に handlerForIntentメソッドを実装します
入力されたインテントを処理できる オブジェクトにマッピングする― ディスパッチャとして動きます 実装では インテントパラメータの型をチェックし その型のインテントを 扱えるオブジェクトを返してください 返されるオブジェクトは そのインテントを処理するために使用される プロトコルを採用しなければなりません 例えば ProcessPhotoIntentのオブジェクトを 処理する場合は ProcessPhotoIntentHandlingのプロトコルを 採用するオブジェクトを返してください
インテントを処理することでアプリケーションの ユーザーインターフェースが更新され ユーザがアプリケーション内で 何かを見る必要がある場合 Intent Handlerは処理段階で関連するUIが 画面上にあることを確認する必要があります
アプリケーションが バックグラウンドで ないことを確かめてください もしそうであれば continueInAppの応答コードで 応答して開くようにシステムに依頼します Xcodeでアプリケーション内のインテント 処理を追加する方法を見てみましょう
私は最近 家で料理を始めました “レシピアシスタント”という お気に入りのレシピを探せる アプリケーションを使い料理に取り組んでいます レシピを1つタップすると 必要なすべての材料を見ることができます “調理法”のボタンをタップすると 調理方法を段階的に見ることができます “次のステップ”ボタンをタップすると 次のステップに進むことができます しかし 食事を準備している間に 画面上のボタンをタップするのは 便利とは限りません そのため ユーザがSiriを使い 声で呼び出すショートカットを用いて 次のステップに 進められるようにしたいと思います ユーザは画面上のコンテンツと やり取りすることになるので アプリケーション内での インテント 処理を実装しようと思っています
ここではXcodeの中で“ShowDirections”という カスタムインテントを定義しています また “Siriに追加”ボタンを レシピの調理法ビューに追加したので ユーザはここにショートカットを 簡単に作ることができます これがアプリケーションの中の様子です
さて Xcodeに戻ります アプリケーションには既に 複数ウィンドウのサポートを適用しました アプリケーション内インテント処理に 適格なインテントのリストへ ShowDirectionsIntentを加える必要があります そのために“プラス”ボタンを クリックし インテントを追加します
さて 私がしたいことは アプリケーションの すべてのビューコントローラーを “次のステップ”コマンドに 応答できるようにすることです
そのために NextStepProvidingプロトコルに 準拠したオブジェクトを受け入れる― 共通のIntentHandlerを定義します
NextStepProvidingプロトコルを採用する ビューコントローラーは IntentHandlerクラスの インスタンスを返す必要があります また ユーザを次のステップに導く nextStep関数を実装する必要があります IntentHandlerをコード生成された― showDirectionsIntentHandlingプロトコルに 適合し resolveメソッドを実装してみましょう
レシピパラメータ用のresolveメソッドでは レシピがあるか確認します もしレシピがなければ あいまいさ排除が必要です そうでなければSuccessを返します HandleメソッドではNextStepProviderに 次のステップへ進むよう伝えます アプリケーションが前面にあることを 確かめる必要があります もしそうでなければ continueInAppに応答する コードを使い アプリケーションを起動させます SceneDelegateでのユーザアクティビティと共に 起動を取り扱う必要があります すぐ後ほど ここに戻ってきます CurrentIntentHandlerへの弱い参照を維持する シングルトンクラスを作ります
アプリケーションの各ビューコントローラーの viewDidAppearに CurrentIntentHandlerを割り当てます
アプリケーションのデリゲートに 新たなhandlerForIntentメソッドを実装し CurrentIntentHandlerインスタンスを 返す必要があります
SceneDelegateオブジェクトでは willConnectToSessionメソッドと continueUserActivityメソッドを実装し Handleメソッドの中で continueInAppに応答する コードに対して応答する時に ユーザのアクティビティを続ける必要があります willConnectToSessionは UISceneオブジェクトを アプリケーションが持っていない時 呼び出されます
次は 各ビューコントローラーを NextStepProvidingプロトコルに 適合させる必要があります そして最後に CurrentIntentHandlerを viewDidAppearに割り当てることを 確かめる必要があります
試しにやってみましょう
まず Siriへのショートカットを追加します
さあ どのような体験になるか見てみましょう Hey Siri 次のステップを
“どのレシピを見たいですか? トマトソース? ひよこ豆カレー? リンゴのケーキ?” 最初のやつを
“はい ご覧ください トマトソースの材料です” Hey Siri 次のステップを
“はい ご覧ください 1つめのステップです 大きな鍋で中火でオリーブオイルを温めます” Hey Siri 次のステップを
“はい ご覧ください 2つめのステップです 刻みニンニクを加え 香りが出るまで炒めます” すごくいいでしょう?
インテントをハンドルする際 Extensionとアプリケーションのどちらを使うか まずは自分自身に尋ねるべきです このタスクはExtensionで実行できるか? もしできるならば そうした方がいいからです Intents Extensionは より軽く 速く起動させることができますが リンクしているフレームワークや シンボルの数によります Extensionがリンクするフレームワークを決定し 起動時間を最適化しましょう 今日ご紹介した アプリケーション内 インテント処理についてまとめます 最初にIntents Extensionを 実装することを考えてください アプリケーションとExtensionの 両方に リンクするフレームワークの数を意識しましょう アプリケーション内インテント処理は マルチウィンドウのみサポートされます 詳細はWWDC 2019の “Introducing Multiple Windows on iPad”と “Architecting Your App for Multiple Windows”をご覧ください アプリケーション内インテント処理を用いた SiriKitインテグレーションが楽しみです 次は 今年作られたもう1つのAPI拡張について 見てみましょう それは“rich disambiguation”と 名付けられました iOS 13にはショートカットのための パラメータが導入されています そのため ユーザは実行時に インテントの パラメータ値を与えることができます インテントのパラメータ値を解決する時 あいまいさを排除した解決結果を返すことができ ユーザは値のリストから選択するよう 求められます
このリストに副題と画像を含める機能が 今年 導入されました
APIは非常にシンプルです 実行時にカスタムタイプに 副題を文字列 画像をINImageとして指定するだけです
注目すべきは画像と副題で動的なオプションを 提供することができるという点です ユーザがショートカットアプリケーションで インテントを設定する時に表示されます
あいまいさ排除のリストへの もう1つの追加機能はSiriでのpaginationです 開発者はSiriがユーザに 一度に話すアイテムの数を提供できるようになり Siriが次に話すintroductionも 提供できるようになりました あいまいさ排除のpaginationが使用されるのは “Hey Siri”と言ってSiriを起動した時のみです Xcodeでrich disambiguationを サポートする方法を説明します カスタムのインテントを定義する IntentDdefinitionファイルを開きます そしてSiri Dialogセクションを展開します custormized disambiguation paginationを 必要とするパラメータのためです ここで 一度にユーザに話すことができる アイテムの最大数を簡単に規定できます 後に続くintroductionのストリームも同様です 音声専用モードでSiriから提供される disambiguation introductionダイアログを インテントエディタで自分自身のダイアログを 明記し上書きすることもできます 今年のSiriKit APIへのもう1つの追加機能は 動的オプションの動的検索です 昨年 動的オプションのAPが導入されました これにより ユーザがショートカットの アプリケーションでインテントを設定することで 適格なパラメータの値のセットを 動的に 提供することができるようになりました 今年はユーザの検索語を含めるように このAPIを拡張しています
入力時に検索結果を提供する 新しいチェックボックスがあります これにチェックするとsearchTermを含む 新たなメソッドをコード生成します このメソッドは ユーザが入力する間 続けて呼び出されます 検索語が空の場合はデフォルト値のリストを ユーザに示すことができます 動的検索は 大きなカタログを検索するために用いるもので 小さな静的なコレクションに フィルタをかけるのには適しません ショートカットのアプリケーションが デフォルトでフィルタをサポートするためです
provide options collectionsメソッド コンプリーションハンドラは 新しいINObjectCollectionオブジェクトを 受け入れます このオブジェクトを使えば 動的なオプションを 表題付きのセクションに分類でき さらにオプションで インデックス付きの照合が使えます iOS 13ではショートカットへの 設定可能なパラメータが導入されましたが ユーザ向きとして規定される各パラメータは 実行時に解決されなければなりませんでした
iOS 14では各パラメータを 設定可能か解決可能か 分けて印付けすることができます Siriとショートカットのアプリケーションは解決 不可能と印付けられたパラメータは解決しません 解決不可能なパラメータへの Siriダイアログを提供する必要がなくなります 今日はアプリケーション内 インテント処理に関するすべてと アプリケーションにそのサポートを 追加する方法を学びました あいまいさ排除のリストと動的オプションを 拡張することを可能にしたのが iOS 14のrich disambiguationです
動的検索により 新くてフレキシブルな方法で Intentパラメータに対する動的オプションを 提供できるようになりました
インテントをデザインしている時に どのパラメータを実行時に設定可能にするか 解決可能にするかを決めてください ここで いくつかヒントとコツをお見せします カスタムインテントを次のレベルに 上げるのに役立つでしょう アプリケーション上の対応する機能をやめて カスタムインテントの2つが不要になった場合 または そのインテントを 別のインテントと置き換える場合 Xcode 12を使ったiOS 15では カスタムインテントを廃止することが可能です インテントエディタの中で 廃止したいインテントを選択し ツールバーのExpand Inspectorsをクリックし インスペクターを出します
そして 廃止のチェックボックスに チェックを入れるだけです
ショートカットのアプリケーションでは 既存のユーザはこのインテントアクションが 今後のバージョンのアプリケーションで 利用できなくなる可能性があることがわかります また このインテントアクションはショート カットのアクションリストからも隠されます 次は カスタムインテントのクラス名を 規定する方法を紹介しましょう カスタムインテントやカスタムタイプ カスタムenumをインテントエディタで定義する時 実際のクラスではなく タイプ名を定義します 実際のクラスはタイプ名に基づいて コード生成されます
そのため アプリケーションが クラスのプレフィックスを使っている時 クラスはカスタムインテントやタイプ又は enumを記述するのに適した場所ではありません
インテントのカスタムクラスインスペクタへ 好きなクラス名を記述してください または 共通のクラスプレフィックスを 記述することもできます それはコード生成の発生が必要なターゲットの プロジェクトドキュメントインスペクターにて すべてのカスタムインテントやタイプ 又はenumsに使われます これにより 必要に応じて異なるターゲットに 異なるクラスプレフィックスを付けられます IntentDefinitionファイルにて定義される カスタムインテントの中には 確認と処理のフェーズにIntents UIビューを 必要とするものと そうでないものがあります それを効率的に管理する方法を 見ていきましょう IntentDefinitionファイルを Intents UI Extensionターゲットに加える時 Xcodeは そのIntentDefinitionファイルから インテントの全てを自動的にリストアップします Intents UI Extensionにより サポートされるようにするためです しかし カスタムインテントの中には UIを全く見せたくないものがあるかもしれません
その時は NonUI_Intentsのための IntentDefinitionファイルを別に作ります 次に IntentDefinitionファイルの ターゲットメンバーシップインスペクタで それをIntents UI Extensionのターゲットに 含めなければいいのです カスタムインテントのためにコード生成言語を 明確に選択したい時もあるでしょう それは プロジェクトビルド設定の中で 簡単に行うことができます
デフォルトでXcodeは自動的に インテントコード生成言語を決めます それは このターゲットに含まれる 既存の検索ファイルに基づいて コード生成に適格なターゲット毎に 決められます しかし ここでは この動作を カスタマイズするオプションがあります では 今日のまとめをします 今年のSiriKit APIにおける 主要な拡張点について説明しました カスタムインテントを設計する際に留意すべき ベストプラクティスについても説明しました 皆さんが構築するものを見るのが楽しみです ご視聴ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。