首页 > 解决方案 > 使用 AWS Lambda 控制台使用 SNS 发送推送

问题描述

我在互联网上尝试了所有可能的解决方案,没有希望

我想要做的只是使用 aws lambda 函数(通过 aws 控制台)从假设 DynamoDB(不包括在问题中)获取用户 fcm 令牌,使用该令牌创建端点Arn,将推送发送到该特定设备

我测试了使用 SNS 控制台发送,并且推送成功到达设备,但我未能使用 Lambda 函数将其发送到设备,尽管它提供了成功状态和消息 ID

这是我使用的代码

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'us-east-1'});
const sns = new AWS.SNS()

const sampleMessage = {
    "GCM": { 
        "notification": { 
            "body": "Sample message for Android endpoints", 
            "title":"Title Test" 
        } 
    }
}



exports.handler = async (event) => {

    const snsPayload = JSON.stringify(sampleMessage);

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    
    const params = {
        PlatformApplicationArn: '<Platform Arn>',
        Token: '<FCM Token>'
    };
    
     try {
        const endpointData = await sns.createPlatformEndpoint(params).promise();

        const paramsMessage = {
            Message: snsPayload,
            TargetArn: endpointData.EndpointArn
        };
        var publishTextPromise = await sns.publish(paramsMessage).promise();

        response.MessageId = publishTextPromise.MessageId;
        response.result = 'Success';
        
     }
     catch (e) {
         console.log(e.stack)
         response.result = 'Error'
     }
  

    return response;
};

标签: amazon-web-servicesaws-lambdaamazon-sns

解决方案


经过一些试验和错误后,我为自己的问题找到了解决方案

1- 有效负载的 GCM 部分应该是字符串而不是 json 2- 消息参数应该有一个属性,将有效负载的 mime 类型显式设置为 Json

考虑到所有这些

 const GCM_data = { 
    'notification': { 
        'body': 'Hellow from lambda function', 
        'title': 'Notification Title' 
    } 
}

const data = {
    "GCM": JSON.stringify(GCM_data)
}
const snsPayload = JSON.stringify(data)

参数应该看起来像

const paramsMessage = {
        Message: snsPayload,
        TargetArn: endpointData.EndpointArn,
        MessageStructure: 'json'
    };

这将起作用:)


推荐阅读