AlexaのAMAZON.StopIntentの応答でEndSessionがtrueまたはnullである必要があるようになってた話
2018年の冬にクリスマススキルとして「ノリノリのサンタ」を公開しました。
そしたら最近このスキルに対してAlexaの審査チームメールがきていました。
審査チームから指摘が来てたけどスルーしてみた
Alexaスキル ノリノリのサンタ に関してご確認ください
このメールが2019年11月と12月に来てました。
内容としては 「ストップ」と話しかけると応答がおかしい、5営業日以内に対応しないとスキルストアから削除しちゃうぞ。 とのこと。
けど放置してても一向に削除されずに公開されたままでした。
原因探し
放置しているのも心苦しいので対処しました。
このスキルはAMAZON.StopIntentとAMAZON.CancelIntentのどちらが来てもスキルを終了するような設計にしてました。
//「ストップ」か「キャンセル」と答えた場合の処理 const stopCancelIntentHandler = { canHandle(handlerInput) { console.log('---canhandle-stopCancelIntentHandler---'); return handlerInput.requestEnvelope.request.type === 'IntentRequest' && ((handlerInput.requestEnvelope.request.intent.name === 'AMAZON.StopIntent') || (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.CancelIntent')) && handlerInput.attributesManager.getSessionAttributes().XXXXX == 'xxxxx'; }, async handle(handlerInput,event) {
上記のようにconsole.logを入れてCloudWatchでみてみたら、ストップはたしかに指摘のあった通り動かないが、キャンセルの場合は想定通りに動作しているではありませんか。
( ˘ω˘)o0(あ・・・これたぶんAlexaの仕様だな・・たぶん・・流れるJSONも変わってるし・・)
ドキュメントをみてみる
みんな大好き公式ドキュメント
キャンセルとストップについては、この2つの概念をスキルで区別する必要がある場合のために、別々のインテントが用意されています。これにより、「ストップ」とは異なる意味で「キャンセル」を使用できます。 これらのインテントは、次のように処理します。
AMAZON.CancelIntent: ほとんどの場合、これは単にスキルを終了させるものです。ただし、スキルに必要な場合は、機能を変更してこのインテントにマッピングできます。ビルトインインテントを実装するを参照してください。
AMAZON.StopIntent: このインテントをスキルに実装する必要があり、応答では、EndSessionはtrueまたはnullである必要があります。また、こちらは、スキル認定プロセスの必須要件でもあります(ストップとキャンセルの認定要件をご覧ください)。AMAZON.CancelIntentと同じ機能が必要な場合は、両方のインテントに同じインテントハンドラーを使用できます。
( ˘ω˘)o0(ほれ、みたことか)
対応
このスキルは本来「ストップ」のあとにユーザーに星の数とコメントを求める例のシステムが動いてるんですけども、そのために
withShouldEndSession(false)
にして処理を継続させていたけどダメになってしまいました。
まぁ分岐させたりすげばいけるんだけども、あんまり使われていないスキルだしめんどくさい。。。
というわけで
withShouldEndSession(true)
に変更して、終了メッセージを流しておしまいにしました。
再申請
動作確認して再申請を実施しました。
このスキルはLambdaを呼んでるので申請しなくても反映されちゃうんですけれども、ハッピーパスを変えたのでちゃんと申請もしておきました。
審査手順説明の欄に
「未対応でさーせんっした。けど5営業日経過してても公開になってましたんで、そこの確認もおねしゃす。」
と添えておきました。
対応に着手して再申請まで30分くらいでした。
余談
このノリノリのサンタは深夜テンションで1~2時間くらいで作ったので僕の声が流れます。深夜テンションの僕の声に興味がある人は使ってみてください。