Любой, кто использует Node.js с уведомлениями Amazon SNS и Apple Push?

Я ищу примеры использования node.js с уведомлениями о загрузке Amazon SNS и Apple APN. Мы используем Amazon для нашего хостинга, и я использовал SNS раньше, это довольно просто. Но примеры, которые они имеют для push-уведомлений, предназначены для java, и нет примеров для node. Это сбивает с толку, как обычно, с ними, и я надеюсь сократить свои исследования и потратить короткое время. Это не может быть так сложно. Мне также интересно, как они справляются с ошибками, а также различия между песочницей и продукцией. Apple реагирует по-разному между двумя средами, не прерываясь в песочнице, как в производстве.

Ответы

Ответ 1

В конце концов, это не так сложно, просто выяснение документации было неприятным. Вам необходимо создать основную конечную точку для темы SNS в консоли, что является самым простым способом, включая загрузку сертификата. Затем вы использовали createPlatformEnpoint для создания конечной точки для каждого идентификатора устройства. Это возвращает другую тему SNS, определенную для этого устройства, которую вы затем используете для отправки сообщения.

Итак, следующее работает, чтобы отправить одно сообщение одному клиенту. Если вы хотите отправить что-то в массовом порядке, не уверен, что вы можете это сделать. Также не знаете, как вы справляетесь с отзывами Apple, которые вы должны проверить на наличие неудачных отправлений.

config = require("./config.js").config;

var token = "1234567898123456789";

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

AWS.config.update({accessKeyId: config.AWSAccessKeyId, secretAccessKey: config.AWSSecretKey});
AWS.config.update({region: config.AWSRegion});

var sns = new AWS.SNS();

var params = {'PlatformApplicationArn':config["AWSTargetARN"],'Token':token};

var message = 'Test';
var subject = 'Stuff';

sns.createPlatformEndpoint(params,function(err,EndPointResult)
{
    var client_arn = EndPointResult["EndpointArn"];

    sns.publish({
    TargetArn: client_arn,
    Message: message,
    Subject: subject},
        function(err,data){
        if (err)
        {
            console.log("Error sending a message "+err);
        }
        else
        {
            console.log("Sent message: "+data.MessageId);

        }
    });
});

Ответ 2

Это довольно прямолинейно, как указал CargoMeister.

Я написал сообщение в блоге о том, как настроить его здесь. http://evanshortiss.com/development/mobile/2014/02/22/sns-push-notifications-using-nodejs.html

У меня также есть оберточный модуль Node.js, который проще в использовании, чем AWS SDK, поскольку я работал над документацией. Он поддерживает службы iOS и Android Push (как и все, с которыми я тестировал/работал), управляет форматами сообщений, отличными от строк, и предоставляет события: https://npmjs.org/package/sns-mobile

Я не использовал темы для управления конечными точками, но не уверен, что это проблема. Вы просто создаете PlatformEndpoints сначала через консоль SNS.

Ответ 3

var AWS = require('aws-sdk');
var express = require('express');
var app = express();

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
 IdentityPoolId: 'add IdentityPoolId'
});

AWS.config.region = 'add region';

var sns = new AWS.SNS();

   sns.createPlatformEndpoint({
    PlatformApplicationArn: 'add platform application arn',
    Token: 'add device token'
   }, function (err, data) {
    if (err) {
     console.log("errorMessage" + err.stack);
     return;
    }

    var endpointArn = data.EndpointArn;
    var payload = {
     default: 'Hello World',
     APNS: {
      aps: {
       alert: 'Hello World',
       sound: 'default',
       badge: 1
      }
     }
    };

    // first have to stringify the inner APNS object...
    payload.APNS = JSON.stringify(payload.APNS);

    // then have to stringify the entire message payload
    payload = JSON.stringify(payload);

    console.log('sending push');
    sns.publish({
     Message: payload,
     MessageStructure: 'json',
     TargetArn: endpointArn
    }, function (err, data) {
     if (err) {
      console.log(err.stack);
      return;
     }

     console.log('push sent');
     console.log(data);
    });
   });

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port

   console.log("Example app listening at http://%s:%s", host, port)
})