Отправка уведомления с помощью функции Lambda с помощью AWS Pinpoint

У меня есть приложение для iOS с серверной частью, созданной MobileHub с помощью API Gateway, Lambda и DynamoDB. Я заметил, что функция SNS в MobileHub была заменена на Pinpoint, и я хотел бы создать систему уведомлений с помощью этой новой службы.

Когда пользователь создает новый пост через API Gateway, срабатывает лямбда-функция, и я полагаю, что могу отправить уведомление подписчикам через Pinpoint. Но я не могу найти ни одного примера или справочного документа на официальном сайте Pinpoint.

Есть ли у вас какие-либо ресурсы для этого сценария или какие-либо идеи? Большое спасибо!


person Azure Chen    schedule 24.07.2017    source источник


Ответы (3)


В зависимости от того, что вы подразумеваете под уведомлением, я предполагаю, что вы хотите отправить push-уведомление определенному пользователю (конечная точка Pinpoint).

Pinpoint сохраняет каждое устройство, связанное с пользователем, в качестве конечной точки, обычно создаваемой библиотекой аналитики на стороне клиента AWS (например, amplify Analytics).

Клиент

С библиотекой аналитики amplify я вызываю updateEndpoint, чтобы указать userId, доступный для Lambda, а также токен устройства и удалить optOut, чтобы пользователь мог получать push-уведомления:

  1. Address — токен, созданный пользователем, давшим разрешение на получение push-уведомлений (iOS).
  2. optOut – NONE, чтобы они могли получать push-уведомления.
  3. userId — уникальный идентификатор пользователя (подраздел Cognito).

Лямбда (узел.js)

Теперь вы можете отправлять push-уведомления, используя userId и Pinpoint SDK.

Пример:

const sendMessagesParams = {
    ApplicationId: process.env.PINPOINT_APP_ID,
    SendUsersMessageRequest: {
        Users: {
            [receiverUserId]: {}
        },
        MessageConfiguration: {
            APNSMessage: {
                Action: 'OPEN_APP',
                Title: 'Message received',
                SilentPush: false,
                Body: `You have a new message`
            },
            GCMMessage: {
                Action: 'OPEN_APP',
                Title: 'Message received',
                SilentPush: false,
                Body: `You have a new message`
            }
        }
    }
};

console.log('sendMessagesParams', JSON.stringify(sendMessagesParams));

pinpoint.sendUsersMessages(sendMessagesParams, (sendMessagesErr, sendMessagesData) => console.log('push sent')

Для вашего конкретного сценария я настраиваю поток DynamoDB и запускаю Lambda при изменении записи в таблице. Возможно, вам потребуется добавить разрешения IAM вручную после создания лямбда-выражения.

Источники

person Dylan w    schedule 29.03.2019
comment
Как вы создаете пинпоинт? Я просмотрел всю документацию, но мне сообщили, что sendUsersMessages не определен. sendMessages работает нормально.. - person Thomas Clowes; 01.04.2019
comment
Я указываю версию API и точную точку региона: const pinpoint = new AWS.Pinpoint({ apiVersion: '2016-12-01', region: process.env.PINPOINT_REGION }); Константы process.env перечислены в разделе «Переменные среды» ниже лямбда-кода. - person Dylan w; 02.04.2019
comment
В вашей функции Lambda вам нужно предоставить учетные данные AWS или роль IAM? Просто ничего не происходит, когда я пытаюсь запустить код, который вы указали - person Attaque; 19.02.2020
comment
@Attaque зависит от того, как вы реализуете, для точного определения я создал политику полного доступа для мобильных устройств, чтобы разрешить отправку сообщений, а также роль потока iam. { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "mobiletargeting:*" ], "Resource": "*" } ] } - person Dylan w; 20.02.2020

Я много боролся с работой лямбда-функции, поэтому пожалуйста, рассмотрите этот ответ как дополнение к ответу Дилана В.

Клиент

import PushNotification from '@aws-amplify/pushnotification';
import Analytics from '@aws-amplify/analytics';

PushNotification.onRegister((token) => {

    Analytics.updateEndpoint({
        address: token,
        channelType: 'APNS',
        optOut: 'NONE',
        // Customized userId
        userId: "e236e3ea-bas9-4eae-967e-0eb9bcaca26d" // Example
    })

});

Лямбда-функция

'use strict';

const AWS = require('aws-sdk');

exports.handler = async (event, context) => {

  var pinpoint = new AWS.Pinpoint();

  const sendMessagesParams = {
    ApplicationId: <YOUR_APPLICATION_ID>, // Find it in Pinpoint->All projects
    SendUsersMessageRequest: {
        Users:{<USER_ID>:{}}, // The same userId as set on the client. This way you can "follow" people if they switch device
        MessageConfiguration:{
          APNSMessage:{
            Action:"OPEN_APP",
            Title:"Message received",
            Body:"You have a new message"
        }
      }
    }
  };

  return await new Promise( (resolve, reject) => {

    pinpoint.sendUsersMessages(sendMessagesParams, (sendMessagesErr, sendMessagesData) => {
      if(sendMessagesErr) reject(sendMessagesErr)
      if(sendMessagesData) resolve(sendMessagesData)
    });

  });

};

Обратите внимание, что вызов точного определения заключен в обещание. Поскольку pinpoint.sendUserMessages принимает обратный вызов, выполнение продолжается (асинхронный характер Node), что отключит лямбда-функцию, и вы не получите никаких выходных данных от функции обратного вызова или получите уведомление, не дожидаясь завершения функции.

person Attaque    schedule 20.02.2020
comment
Я получаю: Не удалось выполнить из-за ошибки конфигурации: Неверный ответ прокси-сервера Lambda Пн, 14 сентября, 08:44:55 UTC 2020: Метод завершен со статусом: 502 Знаете ли вы, как это можно исправить? Я считаю, что это связано с ответом APIGateway, потому что push-уведомления отправляются - person Sk8eR; 14.09.2020
comment
Я использую pinpoint.sendMessages, и он не работает (ни ошибок, ничего). Я обернул его в return await new Promise(...), и теперь сообщение отправляется, потому что функция его ждет. Спасибо за этот совет! - person Matt; 12.01.2021

Это, безусловно, возможно с Amazon Pinpoint. Вы можете найти документацию Javascript SDK здесь.

Есть 2 режима отправки с помощью Pinpoint.

  1. Прямая отправка — фактически то же самое. тем, чем традиционно были социальные сети. Вам нужен токен устройства, и вы можете отправить напрямую своему поставщику push-уведомлений, используя этот токен.
  2. Отправки сегментации. Этот режим немного отличается и предполагает что вы загрузили все свои устройства в Pinpoint через Mobile SDK как часть своего приложения или через импорт S3. Преимущество здесь в том, что вы можете сегментировать свои устройства и отправлять в этот сегмент (например, «Друзья Райана»).

Таким образом, в вашем API, поддерживаемом Lambda, вы можете выбрать либо отправку напрямую подписчикам (если у вас есть их адреса), либо потенциально всему сегменту подписчиков (если вы загрузили свои конечные точки в Pinpoint).

person Cheruvian    schedule 24.07.2017
comment
Должен ли я хранить ARN в моей таблице DynamoDB? Или Pinpoint поможет мне управлять ARN. Если я хочу отправить сообщение в сегмент друзей Райана. Как я мог узнать, что этот сегмент является для Райана этой Cognito личностью? - person Azure Chen; 25.07.2017