使用AWS Pinpoint通过Lambda函数发送通知

时间:2017-07-24 07:37:27

标签: node.js amazon-web-services aws-lambda aws-cognito aws-pinpoint

我有一个带MobileHub API Gateway LambdaDynamoDBSNS的后端版本的iOS应用。 我注意到MobileHub的{​​{1}}功能已被Pinpoint取代,我想使用此新服务创建通知系统。

当用户通过API Gateway创建新帖子时,将触发lambda函数,我想我可以通过Pinpoint向订阅者发送通知。 但我在Pinpoint的官方网站上找不到任何示例或参考文档。

您是否有任何资源可用于此方案或任何想法?非常感谢你!

3 个答案:

答案 0 :(得分:2)

取决于通知的含义,我假设您想向特定用户(pinpont端点)发送推送通知。

Pinpoint将与用户关联的每个设备存储为“端点”,通常由AWS客户端分析库(例如,放大分析)创建。

客户

使用放大分析库,我调用updateEndpoint,以便我可以指定可用于lambda的userId以及设备令牌,并删除optOut以便用户可以接收推送通知:

  1. 地址:-用户接受推送通知权限(iOS)生成的令牌
  2. optOut:“无”,以便他们可以接收推送通知
  3. userId:-用户的唯一ID(认知用户的子对象)

Lambda(node.js)

现在,您可以使用userId和精确的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。创建lambda后,您可能需要手动添加IAM权限。

来源

答案 1 :(得分:1)

我在使lambda函数正常工作方面很费力,所以请将此答案作为Dylan w答案的补充。

客户

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
    })

});

Lambda函数

'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的异步特性),这将关闭lambda函数,并且您不会从回调函数获得任何输出或收到通知,而无需等待该函数完成。

答案 2 :(得分:0)

使用Amazon Pinpoint肯定可以做到这一点。您可以找到Javascript SDK文档here

使用Pinpoint发送有两种模式。

  1. Direct send - 这实际上与SNS传统上的相同。您需要设备令牌,您可以使用该令牌直接发送给您的推送提供商。
  2. Segmentation sends - 此模式略有不同,并假设您已将所有设备通过Mobile SDK作为应用程序的一部分加载到Pinpoint,或通过S3导入。这样做的好处是,您可以对设备进行细分并发送到该细分受众群(例如,&#39; Ryans Friends&#39;)。
  3. 因此,在Lambda支持的API中,您可以选择直接发送给订阅者(如果您有他们的地址),也可以选择发送整个订阅者(如果您已将端点加载到Pinpoint中)。