プッシュ通知

アクションは、タスクの期限が近づいたときにリマインダーを送信するなど、関連性のあるタイミングでユーザーに通知をプッシュできます。

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

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

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

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

システムシーンの構成

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

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

  4. [オプトイン プロンプトをカスタマイズする] で、ユーザーがプッシュ通知の登録を求める際に表示されるプロンプトを入力します。プロンプトは、「$prompt のプッシュ通知を送信しても大丈夫ですか?」という形式で表示されます。

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

オプトインの設定

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

  1. [Scenes](シーン)で [Notifications](通知)システムシーンを選択します。
  2. [条件] で [お客様が「はい」と答えた場合] を選択します。
  3. [Webhook を呼び出す] を有効にして、イベント ハンドラ名(例: subscribe_to_notifications)を指定します。
  4. [プロンプトを送信] を有効にし、通知が送信されることをユーザーに知らせる簡単なプロンプトを入力します。

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

オプトアウトを設定する

プッシュ通知のオプトアウトを設定するには、次の手順を行います。

  1. [条件] で [お客様が「いいえ」と答えた場合] を選択します。
  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. [Continue](続行)をクリックします。
  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));
      });
    });