悠紀(702)58この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。SiriKitとはSiriKitとはiOSアプリをSiriに対応させることができる、一連のフレームワークです。iOSアプリに組み込むことで、Siriとの対話によってiOSアプリのコンテンツ表示や、特定の処理を実行させることができます。10から使えるようになりました。何でもかんでもできるわけではありませんが、決められた機能の範囲であればSiriを通してアプリの機能にアクセスさせることができます。11では、できることがさらに増えました(詳しくは後述)。Interface(VUI)の機能の一部に加えることができます。SiriKitの基礎知識SiriKitを扱うには、いくつかの基礎知識を理解しておく必要があります。1つずつ学んでいきましょう。UIフレームワークSiriKitという名前ではありますが、実際にはSiriKitというフレームワークは存在しません。下記の2つのフレームワークから成り立ちます。UIフレームワークIntentsフレームワークは、iOSとiOSアプリがやりとりするための基本機能を提供します。UIフレームワークは、Siri経由で実行した処理の結果をカスタマイズしたビューとしてスクリーンに表示させる機能を提供します。Extensionの一種)という形で組み込みます。ExtensionとはiOSアプリの機能をアプリ外に拡張するための仕組みです。詳しくは下記を参照してください。ExtensionはユーザーがSiriを使って要求したリクエストを受け取り、iOSアプリ固有のアクションを実行します。Extensionはユーザーからのリクエストを処理した後、その実行結果をレスポンスとしてカスタマイズしたコンテンツを表示します。アプリに組み込むことで、iOSアプリが起動していない状態でも、Siriを経由したリクエストに応答できるようになります。(インテント)を登録します。ドメインは「リクエストの種類」、Intentは「リクエストに応じて行うアクション」のことです。メッセージアプリにSiriKitに組み込むと「○○○さんに△△△と送信して」といった指示をSiriに依頼できるようになります。このような場合、ドメインは「メッセージ」、Intentは「メッセージを送信する」といった形になります。11では、下表のドメインが指定できます。コードの表示などができるようになりました。各ドメインおよびIntentの詳細な解説は、下記を参照してください。Extensionが動作する仕組みを学んでいきましょう。Extensionが動作する上で必ず必要となるのがINExtensionオブジェクトです。Extensionのエントリーポイントであり、Intentの実行が必要になったタイミングでSiriKitから(つまり、ユーザーがSiriを通して依頼を行ったときに)呼び出されます。INExtensionオブジェクトはSiriKitからの呼び出しに対し、Intentを実際に処理するオブジェクトに振り分けることを行います。具体的には、下記のようなメソッドを実装します。このhandler(for:)メソッドはSiriKitからIntentの情報が詰め込まれたINIntentオブジェクト付きで呼び出されます。INIntentオブジェクトにはSiriがユーザから依頼されたときに得たデータが収容されています。このメソッドの戻り値には、Intentに対応するhandlerオブジェクトを渡します。handlerオブジェクトは、各ドメインに定義されているプロトコルに準拠したオブジェクトです。「メッセージを送信する」というIntentに対応させる場合、INSendMessageIntentHandlingプロトコルに準拠したオブジェクトを用意する必要があります。handlerオブジェクトには、Intentを受け取り、必ずレスポンスを返す実装が必要となります。この処理のことをハンドルと呼びます。ハンドルするためのメソッドは、各ドメインに定義されているプロトコル全てに実装が必須なメソッドとして定義されています。「メッセージを送信する」というIntentをハンドルするためのメソッドは、次のように実装します。ハンドルするためのメソッドの引数は、原則的にIntentオブジェクトとコールバック用の関数オブジェクトが定義されています。これは、全てのドメインで共通です(扱うクラスがIntentごとに異なるため、各プロトコルで個別にルールに従うように定義されている)。「メッセージを送信する」というIntentの場合はINSendMessageIntentResponseを使います。コールバック関数の引数には各ドメインに定義されたresponseオブジェクトを渡します。このresponseオブジェクトは、最終的にSiriを介してユーザーに伝える情報を収容します。ユーザーに伝える情報量を増やすため、可能な限り多くの情報を詰め込んだ方がベターとされています。Intentの処理に必要な情報を揃えるhandlerオブジェクトは、SiriKitから呼び出されたとき、具体的な要求(Intent)の内容が収容されたIntentオブジェクトを元に処理を行うように実装する必要があります。このとき、Intentに対する処理を行う上で必要な情報を受け取らなければなりませんが、Intentオブジェクトに収容されている情報が不十分である可能性があります。これは、ユーザーのSiriを使った音声での依頼の仕方に揺らぎが出るために起こり得ます。いう3つのフェーズを実装できるようになっています。この3つのフェーズの概要は、次の通りです。Intentに対応する処理を実行するリゾルブリゾルブフェーズでは、Intentオブジェクトに収容されているデータを確認し、必要な情報が揃っているか確認します。情報が欠如していた場合には、情報の追加をSiri経由でユーザーに依頼することができます。リゾルブフェーズを追加するには、各ドメインに定義されたIntentに対応するプロトコルのレゾルブメソッドを実装します。リゾルブフェーズの追加は任意であり、必要であれば実装します。「配車を予約する」Intentの場合は次のように実装します。適切な降車場所であればそれを採用する。resultオブジェクトというデータとして返します。resultオブジェクトは、各ドメインでINIntentResolutionResultのサブクラスが定義されているため、該当するクラスをインスタンス化します。結果として、次のような値を指定することができます。値をうまく整合できた。曖昧さを解消する必要がある。ユーザのコンファームが必要である。値が必要である(値が足りない)。この値には対処できない。コンファームコンファームフェーズでは、Intentオブジェクトに収容されているデータの最終確認を行い、Intentをハンドルできる状態になっているか確認します。リゾルブされた全ての情報がIntentオブジェクトに集約されるので、揃った情報を使って本当に処理の実行が可能かどうか検証する処理を加えることができます。コンファームメソッドはリゾルブと同様、各プロトコルに定義されています。「ワークアウトを開始する」Intentの場合は次のように実装します。completion(response)}コンファームフェーズの追加は必ず必要というわけではありませんが、できるだけ実装した方が良いとされています。「ユーザー間の送金」Intentでコンファームメソッドを実装すると、送金することの最終確認をSiriがユーザーに求めてくれるようになります。アプリによっては、アプリ独自の用語やキーワードといったを語彙を使用している場合があります。その独自の語彙をSiriが解釈できるように設定できます。次の2つの方法のいずれかを使って、語彙を登録します。アプリ自体に追加する詳しくは公式ドキュメントを参照してください。SiriKitプログラミングガイド:独自の語彙の指定SiriKitを使ったiOSアプリの作りかたの基本SiriKitを使ったiOSアプリの開発を始めるにあたり、まず試すべきはメッセージアプリへの組み込みです。公式のサンプルコードである「UnicornChat」を動かしてみるのが最も手軽です。Extensionのテンプレートも「メッセージ」ドメインを用いた場合の実装コードになっているので、こちらで試してみるのもよいかと思います。どちらも試してみた記事をDevelopers.IOで公開中ですので、参考にしながら試してみてください。コードの表示の2つのIntentを試してみます。Appのテンプレートで作成した状態から始めることとするため、事前に作成しておいてください。Siriからメモを作成できるアプリを作るまずはメモの作成に応答するだけのiOSアプリを作ってみましょう。メモの作成をSiri経由で行えるようにします。NameはVoiceMemoAppとします。iOSアプリのTargetのCapabilityを設定するまず、iOSアプリでSiriを利用できるようにするため、Capabilityを設定します。SiriのCapabilityが設定された<アプリ名>.entitlementsが作られます。Extensionを追加します。Extensionを選びます。ここではVoiceMemoAppExtensionとします。Extensionも一緒にTargetに追加できます。Extensionだけ試したいので、チェックは外しておきます。ExtensionのSchemeを使えるようにするか問われます。デバッグに必要なのでActivateを選びます。VoiceMemoAppExtensionというTargetが作られました。Groupの中にIntentHandler.swiftとInfo.plistが作られます。Extensionとして動作するテンプレートです。Extensionを開発する場合、設定を修正する必要があります。VoiceMemoAppExtensionのInfo.plistを修正します。IntentsSupportedを展開します。Extensionの場合はIntentsSupportedおよびIntentsRestrictedWhileLockedを設定します。経由でどのようなことを指示できるようにするか)を設定します。IntentsRestrictedWhileLockedはデバイスのロックを解除する必要があるIntentの種類(例えば決済など)を設定します。今回はIntentsSupportedの中にあるすべての項目を削除したあと、下記の項目を追加します。INCreateNoteIntent(ノートに追加するIntent)iOSアプリにSiriの利用許可の要求を実装する次に、iOSアプリ側の設定に移ります。iOSアプリでSiriと相互にやりとりを行うことができるようユーザーにSiriの利用許可を要求する設定および実装を行います。これは、プッシュ通知の許可や位置情報サービスの利用許可などといったユーザーに許可を要求する仕組みのSiri版といった感じです。いう表記に変わります)。次に、利用許可を要求する実装をビューコントローラーに加えます。実際の開発では要求する適切なタイミングはいつかよく考えて組み込む方が良いですが、今回はサンプルということでアプリ起動時に初めに表示されるViewControllerクラスに実装します。要求するにはINPreferencesクラスのクラスメソッドであるrequestSiriAuthorization(_:)を呼び出します。}iOSアプリを実行すると、Siriの利用許可を要求するアラートが表示されるようになります。このアラートが表示されるのは初回のみです(一度キャンセルした場合は設定から有効化できる)。Extension側の実装に移ります。プロトコルやINSearchForMessagesIntentHandlingプロトコルの実装コード)が実装されています。これらの実装コードは使わないので、まずは「メモを作成する」というIntentに必要な実装コードに書き換えます。}「ノートを作成する」Intentを作る場合は、IntentHandlerクラスにINCreateNoteIntentHandlingプロトコルに準拠させる必要があります。このように、ある種類のIntentクラスに対してIN~IntentHandlingプロトコルがペアとなって定義されているのが基本です。INCreateNoteIntentHandlingプロトコルに準拠させるにはhandle(intent:completion:)メソッドの実装が必須となっています。このメソッドはSiriKitから要求が来ると呼び出され、第一引数のintentにどのような要求が行われたか詳細なデータが入ってきます。それに応じた処理を実行したあとにcompletionハンドラを呼び出すことで、SiriKitを経由してユーザーにレスポンスを返すことができます。このハンドラは引数としてINCreateNoteIntentResponseインスタンスを必要としていますので、生成して返します。上記のコード例では新しく生成したINCreateNoteIntentResponseインスタンスに、引数として渡されたintentに入っている情報をセットし、completionハンドラを呼んでいます。実際にメモアプリを開発する際は、この前のタイミングで保存処理を実装します。ExtensionのSchemeを選択して実行します。iOS上でSiriが立ち上がります。この際に実行対象はiOSデバイスの実機でもiOSシミュレータでも、どちらからでも試すことができます(iOSシミュレータの場合はMacのスピーカーに話しかける)。「VoiceMemoAppで休暇というメモを作ってモントリオール大好きと書いて」と依頼すると、作成されたメモの結果が表示されます。Siriに問いかけてみるとよく分かりますが、呼びやすいアプリ名の方が明らかに好ましいです。アプリ名が長かったり、複数の呼び方があったりすると、音声での指示がしづらいです。「メモ」ドメインでは他にも「既存のメモに追加する」や「メモを検索する」、「タスクを作成する」などといったIntentが提供されています。詳しくは下記をご覧ください。DocumentationSiriからQRコードを表示できるアプリを作る続いて、QRコードを表示するiOSアプリを作ってみましょう。SiriからQRコードを要求されたときに、QRコードをSiriに表示できるようにします。NameはQRAppとします。Targetの追加の手順は、前述しているメモアプリと同様のため割愛します。QRコードを用意するIntentを使って表示することができるQRコードは、原則として保存済みの画像ファイルまたはインターネットからダウンロードできる画像ファイルのようです。そのため本記事では、QRコード画像ファイルをあらかじめ作成し、Xcodeプロジェクトに追加しておく必要があります。今回はqr.pngというQRコード画像ファイルを作成しました。QRコードの画像ファイルの生成はこちらを利用させていただきました。ExtensionのTargetのinfo.plistに、「QRコードを作成する」Intentを設定します。IntentsSupportedを展開し、中のアイテムを下記に変更します。コードの取得)IntentHandlerクラスを実装するIntentHandlerクラスには「メッセージ」ドメインのための実装が記述されているので、削除したのち以下のコードに書き換えます。}デバッグ実行し、Siriから呼び出す以上で実装は終わりです。ExtensionのSchemeをデバッグ実行し、Siriを立ち上げます。「QRAppでブログのバーコードを表示して」と依頼すると、QRコードが表示されます。QRコードを表示するIntentの開発方法についての情報は、公式ドキュメントとして公開されています。こちらもあわせてご覧ください。Guidelinesで解説されています。開発の前に一読しておくと、Siriによりマッチした一連のエクスペリエンスが提供できると思います。Guidelinesまとめ音声からiOSアプリを操作することができるSiriKitは、既存のiOSアプリに新しいユーザーインターフェースを提供することができる、素晴らしい機能です。バージョンアップにともなって進化を繰り返し、非常に有能なパーソナルアシスタントに成長しました。声による操作自体も今となってはかなり普及しており、若者を中心に使われ始めています。音声インターフェースの特に重要なポイントは必要なときだけ使われるというところです。あるときは音声での指示の方が簡単になる場面もありますが、あるときはアプリを起動して操作したほうが早くタスクをこなせる場面もあります。iOSアプリの拡張ですので、SiriKitを使った音声インターフェースはiOSアプリの機能を使うためのショートカットとして提供するという認識が大事だと思います。参考記事この記事の執筆にあたり、下記の情報を参考にいたしました。7,024,203主に自分自身、ブログ、子ども、ポケモンを育てています。アウトプット」となるよう、自分の得た情報により多くの付加価値を添えて発信することを心がけて生きております。ブログの記事の中の1バイトでも、どこかの誰かの為になれば幸いです。〜iOS7についての考察とfladdictデザイン論〜」に参加してきました。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。濱田孝治371re:Invnetの動画検索でもめちゃくちゃ便利ですが、その他ブログやホワイトペーパーやGitHubも横断検索できるので、是非一度使ってみてください。CAFEの他、NTTデータとセブンイレブンの取り組みや、サインポスト、Zippinなどの各社と流通・小売業との連携を業界マップに作成してみました。PolicyのConditionにaws:CalledViaというキーが追加されました。いったキーなのかご説明します。夏目祐樹410こんにちは、CX事業本部の夏目です。MacのタッチバーのタッチIDが非常に便利なのですが、Terminalでsudoを叩かないと行けないときに使えたらなぁと思ったので、情報を共有します。濱田孝治371re:Invnetの動画検索でもめちゃくちゃ便利ですが、その他ブログやホワイトペーパーやGitHubも横断検索できるので、是非一度使ってみてください。臼田佳祐296ワークフロー自動化OSSのn8nをAWS環境で建てて検証してみました。非常に期待できるサービスです。Fargateの勉強をしています。使ってみたい方は参考にしてください。洋介256SnowflakeがAWSの東京リージョン上で稼働するようになりました。データを日本に置けます。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。