푸시 알림

작업이 관련성이 있을 때마다 사용자에게 알림을 푸시할 수 있습니다(예: 작업 마감일이 가까워지면 알림 전송).

이 가이드에서는 작업의 푸시 알림을 설정하는 방법을 설명합니다.

지원되는 표면

푸시 알림은 Android 및 iOS 기기에서 사용할 수 있습니다. iOS 기기에 푸시 알림을 받으려면 어시스턴트 앱이 설치되어 있어야 합니다. 현재 음성 인식 스피커, 스마트 디스플레이 또는 기타 플랫폼에서는 지원되지 않습니다.

기본 요건

프로젝트에는 사용자가 어시스턴트에서 수신된 푸시 알림을 탭할 때 호출되는 전역 인텐트가 하나 이상 포함되어야 합니다.

시작하기

다음 섹션에서는 작업에서 푸시 알림을 설정하는 방법을 설명합니다.

트리거할 인텐트 만들기

이 섹션에서 만든 인텐트가 알림 흐름을 트리거합니다. 이 인텐트를 만들려면 다음 단계를 따르세요.

  1. Actions 콘솔로 이동하여 상단 메뉴에서 Develop을 클릭합니다.
  2. 왼쪽 메뉴에서 인텐트를 클릭하여 섹션을 펼칩니다.
  3. 목록 하단의 를 클릭하고 새 인텐트의 이름을 입력합니다.
  4. Enter/Return를 눌러 새 인텐트를 만듭니다.
  5. 알림 흐름을 트리거하는 학습 문구를 추가합니다. 다음은 몇 가지 예시입니다.

    • Notify me
    • Send notifications
    • Subscribe to notifications
  6. 저장을 클릭합니다.

시스템 인텐트로 전환

Notifications 시스템 장면으로의 전환을 설정하려면 다음 단계를 따르세요.

  1. 왼쪽 메뉴의 장면에서 알림 구독 흐름을 추가할 장면을 클릭합니다.
  2. 장면의 사용자 인텐트 처리 섹션에서 +를 클릭하여 새 인텐트 핸들러를 추가합니다.
  3. Intent에서 이전 섹션에서 만든 인텐트를 선택합니다.
  4. 전환에서 알림 시스템 장면을 선택합니다.

  5. 저장을 클릭합니다.

시스템 장면 구성

Notifications 시스템 장면을 구성하려면 다음 단계를 따르세요.

  1. 왼쪽 메뉴의 장면에서 새로운 알림 시스템 장면을 선택합니다.
  2. Configure intent(인텐트 구성) 섹션에서 Select intent(인텐트 선택)를 클릭합니다.
  3. Select intent(인텐트 선택) 섹션에서 사용자가 푸시 알림을 탭할 때 일치시킬 인텐트를 선택합니다.

  4. 선택 메시지 맞춤설정에 푸시 알림을 구독하라는 메시지가 표시될 때 사용자에게 표시되는 메시지를 입력합니다. 메시지는 '$prompt에 대한 푸시 알림을 보내도 괜찮을까요?' 형식입니다.

  5. 저장을 클릭합니다.

선택 구성

푸시 알림 선택을 구성하려면 다음 단계를 따르세요.

  1. Scenes에서 알림 시스템 장면을 선택합니다.
  2. 조건에서 사용자가 '예'라고 말하는 경우를 선택합니다.
  3. 웹훅 호출을 사용 설정하고 이벤트 핸들러 이름(예: 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. 사용자가 알림을 선택 해제한 후 대화를 종료하려면 전환에서 대화 종료를 선택합니다.

웹훅 구성

웹훅을 구성하려면 다음 단계를 따르세요.

  1. 웹훅에서 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 콘솔로 이동하여 프로젝트 선택 드롭다운에서 프로젝트를 선택합니다.
  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));
      });
    });