プッシュ通知

アクションは、タスクの期限が近づいたときにリマインダーを送信するなど、必要に応じてユーザーにプッシュ通知を送信できます。

このガイドでは、アクションのプッシュ通知を設定する方法について説明します。

サポート対象のサーフェス

プッシュ通知は Android デバイスと iOS デバイスで利用できます(iOS デバイスにプッシュ通知を受信するには、アシスタント アプリをインストールする必要があります)。現時点では、音声認識スピーカーやスマートディスプレイなどのサーフェスではサポートされていません。

前提条件

プロジェクトには、少なくとも 1 つのグローバル インテントが含まれている必要があります。このインテントは、ユーザーがアシスタントから受け取ったプッシュ通知をタップすると呼び出されます。

始める

以下のセクションでは、アクションでプッシュ通知を設定する方法について説明します。

トリガーするインテントを作成する

このセクションで作成するインテントによって、通知フローがトリガーされます。作成 手順は次のとおりです。

  1. Actions Console に移動し、トップメニューで [Develop] をクリックします。
  2. 左側のメニューで [Intents] をクリックしてセクションを展開します。
  3. リストの下部にある をクリックし、新しいインテントの名前を入力します。
  4. Enter/Return を押して新しいインテントを作成します。
  5. 通知フローをトリガーするトレーニング フレーズを追加します。以下にいくつか例を示します。

    • Notify me
    • Send notifications
    • Subscribe to notifications
  6. [保存] をクリックします。

システム インテントへの移行

Notifications システムシーンへの移行を設定する手順は次のとおりです。

  1. 左側のメニューの [シーン] で、通知の登録フローを追加するシーンをクリックします。
  2. シーンの [User intent handle] セクションで、[+] をクリックして新しいインテント ハンドラを追加します。
  3. [Intent(インテント)] で、前のセクションで作成したインテントを選択します。
  4. [Transition] で [Notifications] システムシーンを選択します。

  5. [保存] をクリックします。

システムシーンを設定する

Notifications システムシーンを設定する手順は次のとおりです。

  1. 左側のメニューの [シーン] で、新しい [通知] システムシーンを選択します。
  2. [Configure intent] セクションで、[Select intent] をクリックします。
  3. [Select intent] セクションで、ユーザーがプッシュ通知をタップしたときに一致させるインテントを選択します。

  4. [オプトイン メッセージをカスタマイズする] で、プッシュ通知の登録を求められたときに表示するメッセージを入力します。プロンプトの形式は、「$prompt のプッシュ通知を送信してもよろしいですか?」です。

  5. [保存] をクリックします。

オプトインの設定

プッシュ通知を有効にする手順は次のとおりです。

  1. [Scenes] で [Notifications] システムシーンを選択します。
  2. [Conditions] で、[If the user like "yes"] を選択します。
  3. [Call your webhook] を有効にし、subscribe_to_notifications などのイベント ハンドラ名を指定します。
  4. [プロンプトを送信] を有効にし、通知が送信されることをユーザーに知らせる簡単なプロンプトを入力します。

    candidates:
    - first simple:
      variants:
      - speech: 'Great, I'll send you notifications.'
    
  5. [移行] で [会話を終了] を選択すると、ユーザーが通知に登録した後に会話が終了します。

オプトアウトの設定

プッシュ通知のオプトアウトを設定する手順は次のとおりです。

  1. [Conditions] で [If the user decide "no"] を選択します。
  2. [プロンプトを送信] を有効にし、通知が送信されないことをユーザーに知らせる簡単なプロンプトを入力します。

    candidates:
    - first simple:
      variants:
      - speech: Okay, I won't send you notifications.
    
  3. ユーザーが通知を無効にした後で会話を終了するには、[移行] で [会話を終了] を選択します。

Webhook の構成

Webhook を構成する手順は次のとおりです。

  1. Webhook で、updatesUserId を保存するためのインテント ハンドラを追加します。

    app.handle('subscribe_to_notifications', conv => {
      const intentName = '<name_of_intent_to_trigger>';
      const notificationsSlot = conv.session.params['NotificationSlot_${intentName}'];
      if(notificationsSlot.permissionStatus == 'PERMISSION_GRANTED') {
        const updateUserId = notificationsSlot.additionalUserData.updateUserId;
        // Store the user ID and the notification's target intent for later use.
        // (Use a database, like Firestore, for best practice.)
      }
    });
    

通知を送信する

プッシュ通知は、Actions API を使用してユーザーに送信されます。この API を使用するには、Google Cloud プロジェクトで API を有効にし、JSON サービス アカウント キーを設定してダウンロードする必要があります。

その後、Google OAuth2 クライアント ライブラリを使用して、サービス アカウント キーをアクセス トークンと交換し、そのトークンを使用して Actions API に対するリクエストを認証できます。

サービス アカウント キーを取得する

  1. Google API Console に移動し、[プロジェクトを選択] プルダウンからプロジェクトを選択します。
  2. [有効にする] をクリックして、プロジェクトで Actions API を有効にします。
  3. Google Cloud コンソールの [認証情報] ページに移動し、[プロジェクトを選択] プルダウンからプロジェクトを選択します。
  4. [認証情報を作成] > [サービス アカウント] をクリックします。
  5. サービス アカウント名を入力し、[作成] をクリックします。
  6. [ロールを選択] プルダウンから、[プロジェクト >オーナー
  7. [続行] をクリックします。
  8. [キーを作成] をクリックして、サービス アカウントの JSON ファイルをダウンロードします。

キーを交換してアクセス トークンを取得し、通知を送信する

Actions API を使用してプッシュ通知を送信するには、サービス アカウント キーを交換してアクセス トークンを取得する必要があります。そのためには、Google API クライアント ライブラリを使用することをおすすめします。以降の一連のコード スニペットでは、Google API Node.js クライアント ライブラリを使用します。

  1. Google API クライアント ライブラリとリクエストをインストールします。

    npm install googleapis request --save

  2. 次のコードを使用してサービス アカウント キーからアクセス トークンを取得し、プッシュ通知を送信します。

    // Use the Actions API to send a Google Assistant push notification.
    let client = auth.fromJSON(require('./service-account.json'));
    client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'];
    let notification = {
      userNotification: {
        title: 'Example notification title',
      },
      target: {
        userId: '<UPDATES_USER_ID>',
        intent: 'Notifications Intent',
      },
    };
    client.authorize((err, tokens) => {
      if (err) {
        throw new Error('Auth error: ${err}');
      }
      request.post('https://actions.googleapis.com/v2/conversations:send', {
        'auth': {
          'bearer': tokens.access_token,
        },
        'json': true,
        'body': {'customPushMessage': notification, 'isInSandbox': true},
      }, (err, httpResponse, body) => {
        if (err) {
          throw new Error('API request error: ${err}');
        }
        console.log('${httpResponse.statusCode}: ' + '${httpResponse.statusMessage}');
        console.log(JSON.stringify(body));
      });
    });