【问题标题】:Anyone using Node.js with Amazon SNS and Apple Push Notifications?有人将 Node.js 与 Amazon SNS 和 Apple 推送通知一起使用吗?
【发布时间】:2014-03-03 18:22:05
【问题描述】:

我正在寻找将 node.js 与 Amazon SNS 和 Apple APN 推送通知结合使用的示例。我们使用 Amazon 进行托管,我之前也使用过 SNS,这很简单。但是他们提供的推送通知示例是针对 java 的,没有针对 Node.js 的示例。和往常一样,这很令人困惑,我希望减少我的研究和花费的时间。不可能那么难。我也想知道他们如何处理错误,以及沙盒和生产之间的差异。 Apple 在两种环境中的反应不同,不会像在生产环境中那样在沙盒中失败。

【问题讨论】:

    标签: node.js amazon-web-services apple-push-notifications amazon-sns


    【解决方案1】:
    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)
    })
    

    【讨论】:

    • 一个简短的总结可以帮助审阅者(比如我)判断你的答案的有效性;感兴趣的用户不必深入研究代码即可理解您的方法。一两句话就可以了,不用做太多的工作。
    • 这是我认为最安全的实现。为我工作。谢谢!
    【解决方案2】:

    正如 CargoMeister 指出的那样,这相当简单。

    我写了一篇关于如何设置的博文,在这里查看http://evanshortiss.com/development/mobile/2014/02/22/sns-push-notifications-using-nodejs.html

    我还有一个 Node.js 包装器模块,它比 AWS 开发工具包更易于使用,因为我在文档中工作过。它支持 iOS 和 Android 推送服务(这就是我测试/使用过的全部),管理字符串以外的消息格式并公开事件:https://npmjs.org/package/sns-mobile

    我没有使用主题来管理端点,但不确定这是一个问题。您只需先通过 SNS 控制台创建 PlatformEndpoints。

    【讨论】:

    • 不错。我会检查一下。我们发现的一件事是,如果您尝试一次向新用户发送一大堆数据,则必须创建端点,而且需要很长时间。
    • 是的,我想这更像是一个 I/O 问题,与 Amazon 允许创建的速度有多快有关,以及创建每个新用户都需要一个新的 HTTP 请求这一事实
    • 你的博客不活跃@eshortie 现在真的可以使用它:)
    【解决方案3】:

    结果并没有那么难,只是发现文档令人不快。您需要在控制台中为 SNS 主题创建主端点,这是迄今为止最简单的方法,包括加载证书。然后,您使用 createPlatformEnpoint 为每个设备 ID 创建一个端点。这将返回另一个特定于该设备的 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);
    
            }
        });
    });
    

    【讨论】:

    • 我们可以发送任何图像以及消息@cargomeister
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多