如何使用Node JS和Amazon SNS向iOS设备发送VoIP推送通知

5
我正在尝试使用名为sns-mobileAmazon SNS API的NodeJS包直接向iOS设备发送VoIP推送通知。但是,当我尝试使用以下代码发送VoIP推送时,我会收到以下错误消息。请问有人能建议我错在哪里吗?我已经花了将近半天的时间来解决这个问题。

无效参数:JSON必须包含“default”或“APNS_VOIP”的条目

var iOSApp = new SNS({
      platform: SNS.SUPPORTED_PLATFORMS.IOS,
      region: 'us-west-2',
      apiVersion: '2010-03-31',
      accessKeyId: 'XXXXXXXXXXXXX',
      secretAccessKey: 'XXXXXXXXXXXXX',
      platformApplicationArn: 'arn:aws:sns:us-west-2:3303035XXXXX:app/APNS_VOIP/VoIPPushesApp'
    }); 

iOSApp.addUser('deviceID', 
  JSON.stringify({
   "APNS_VOIP": JSON.stringify({aps:{alert:"Hello and have a good day."}})
  })
  , function(err, endpointArn) {
  if(err) {
    console.log("The Error is :****: "+JSON.stringify(err, null, 4));
    throw err;
  }


  // Send a simple String or data to the client 
  iOSApp.sendMessage(endpointArn, 'Hi There!', function(err, messageId) {
  //iOSApp.sendMessage(endpointArn, messageTest, function(err, messageId) {
    if(err) {
      console.log("The Error in end message is :****: "+JSON.stringify(err, null, 4));
      throw err;
    }
    console.log('Message sent, ID was: ' + messageId);
  });
});
2个回答

2

以下是发送VoIP通知至接收设备的代码,使用其设备VoIP令牌。当接收到VoIP通知时,设备会调用一个名为didReceiveIncomingPushWithPayload的函数。

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

// Amazon SNS module
AWS.config.update({
  accessKeyId     : 'XXXXXXXXXXXXXXXX',
  secretAccessKey : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
  region          : 'us-west-2'
});

var amazonSNS             =   new AWS.SNS();

// 1. Create Platform Endpoint
var createPlatformEndpoint = function(req, res, next){
  var deviceVoipToken = req.deviceVoipToken;  // Obtaining the device VoIP token from the request object

  amazonSNS.createPlatformEndpoint({
    // App in Sandboxmode (ie running on device directly from Xcode)
    PlatformApplicationArn: "arn:aws:sns:us-west-2:xxxxxxxxxxxx:app/APNS_VOIP_SANDBOX/CurieVoip",
    // App in Production mode (ie running on device after archiving and installed on device with a provisioning profile)
    //PlatformApplicationArn: "arn:aws:sns:us-west-2:xxxxxxxxxxxx:app/APNS_VOIP/CurieVoip",
    Token: deviceVoipToken


  }, function(err, data) {
    if (err) {
      console.log(err.stack);
      response.json({"status": "failure", "statusCode" : 402})
      return;
    }
    var endpointArn = data.EndpointArn;
    req.endpointArn = data.EndpointArn; // Passing the EndpointArn to the next function
    next()
  })
}


// 2. Publish notification
var publishVoipNotification = function(req, res, next){
  var endpointArn = req.endpointArn;

  var payload = {
    default   : 'Hello World, default payload',
    APNS_VOIP : {
      aps: {
        alert: 'Hi there',
        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');
  amazonSNS.publish({
    MessageStructure  : 'json',
    Message           : payload,
    TargetArn         : endpointArn
  }, function(err, data) {
    if (err) {
      console.log("Error stack: "+err.stack);
      var message =  "There has been an error in Publishing message via AmazonSNS with error: "+err.stack;
      res.json({"status": "failure", "statusCode" : 402, "message" : message})
      return;
    }
    next();
  });
}


// 3. Deleting platform endpoint after sending a voipNotification; Ref: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SNS.html#deleteEndpoint-property
var deleteEndpointArn = function(req, res){
  var endpointArn = req.endpointArn;
  var roomName    = req.roomName;

  var params = {
    EndpointArn: endpointArn /* required */
  };

  amazonSNS.deleteEndpoint(params, function(err, data) {
    if (err){
      var message = "Unable to deleteEndpointArn, with error: "+err.stack;
      res.json({"status": "failure", "statusCode" : 400, "message":message})
    }
    else{
      var message = "Deleted endpointArn successfully";
      res.json({"status": "success", "statusCode" : 200, "message":message})

    }
  });
}
router.post('/sendVoipNotificationToReceiver', [createPlatformEndpoint, publishVoipNotification, deleteEndpointArn]);

它在Node.js中无法工作..?你能解释一下吗?我该如何将其集成到Node.js API中..? - imran ali

0
  1. 前往Amazon SNS
  2. 点击移动:推送通知
  3. 点击创建平台应用程序
  4. 使用Apple凭据“用于沙盒中的开发”,如果您想在沙盒中测试voip通知,请勾选此复选框。
  5. 推送证书类型--Voip推送证书
  6. 上传证书.P12文件。
  7. 保存表格并复制ARN

创建Lambda函数。以下是代码示例

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

var amazonSNS = new AWS.SNS();

const isset = (s) => {
    return typeof s !== typeof undefined ? true : false;
};

exports.handler =  (event, context, callback) => {
    let data = event['body-json'];
    if (isset(data)) {
        let getAction = data['action'];
        let userToken = data['token'];
        let webPayload = data['payload'];

        if (isset(getAction) && getAction == 'APNS_VOIP') {
            amazonSNS.createPlatformEndpoint({
                PlatformApplicationArn: 'YOUR APPLICATION ARN',
                Token: userToken
            }, function (err, data1) {
                if (err) {
                    //handle error
                    console.log(err)
                } else {
                    //Publish notification
                    var endpointArn = data1.EndpointArn;
                    console.log("endpointArn",endpointArn);
                    var payload = {
                        default: 'Silent voip push notification',
                        APNS_VOIP: {
                            //aps:webPayload
                            "aps" : {
                                "alert" : {
                                    "title" : "Call Request"
                                },
                                "data":webPayload,
                                "content-available":1,
                                "category":"GENERAL"
                            }
                        }
                    };
                    payload.APNS_VOIP = JSON.stringify(payload.APNS_VOIP);
                    payload = JSON.stringify(payload);
                    amazonSNS.publish({
                        MessageStructure: 'json',
                        Message: payload,
                        MessageAttributes:{
                            "AWS.SNS.MOBILE.APNS.PRIORITY":{"DataType":"String","StringValue":"10"}, 
                            "AWS.SNS.MOBILE.APNS.PUSH_TYPE":{"DataType":"String","StringValue":"voip"} 
                        },
                        TargetArn: endpointArn
                    }, function (err, data2) {
                        if (err) {
                            //handle error
                            console.log(err)
                        } else {
                            var params = {
                                EndpointArn: endpointArn /* required */
                            };
                            //Deleting platform endpoint after sending a voipNotification; 
                            amazonSNS.deleteEndpoint(params, function (err, data3) {
                                if (err) {
                                    //handle error
                                    //console.log(err);
                                    callback(null, {
                                        "status": "error",
                                        "data": [],
                                        "message": []
                                    });
                                } else {
                                    //code success
                                    console.log("delete",data3);
                                    callback(null, {
                                        "status": "Success",
                                        "data": data3,
                                        "message":"notification sent successfully"
                                    });
                                }
                            });
                        }
                    });
                }
            });
        }
        else if (isset(getAction) && getAction == 'APNS_VOIP_SANDBOX') {
            amazonSNS.createPlatformEndpoint({
                PlatformApplicationArn: 'YOUR APPLICATION ARN',
                Token: userToken
            }, function (err, data1) {
                if (err) {
                    //handle error
                    console.log(err)
                } else {
                    //Publish notification
                    var endpointArn = data1.EndpointArn;
                    console.log("endpointArn",endpointArn);
                    var payload = {
                            default: 'Silent voip push notification',
                            APNS_VOIP_SANDBOX: {
                        "aps" : {
                            "alert" : {
                                "title" : "Call Request"
                            },
                            "data":webPayload,
                            "content-available":1,
                            "category":"GENERAL"
                        }
                    }
                        };
                    payload.APNS_VOIP_SANDBOX = JSON.stringify(payload.APNS_VOIP_SANDBOX);
                    payload = JSON.stringify(payload);
                    amazonSNS.publish({
                        MessageStructure: 'json',
                        Message: payload,
                        MessageAttributes:{
                            "AWS.SNS.MOBILE.APNS.PRIORITY":{"DataType":"String","StringValue":"10"}, 
                            "AWS.SNS.MOBILE.APNS.PUSH_TYPE":{"DataType":"String","StringValue":"voip"} 
                        },
                        TargetArn: endpointArn
                    }, function (err, data2) {
                        if (err) {
                            //handle error
                            console.log(err)
                        } else {
                            var params = {
                                EndpointArn: endpointArn /* required */
                            };
                            //Deleting platform endpoint after sending a voipNotification; Ref: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SNS.html#deleteEndpoint-property
                            amazonSNS.deleteEndpoint(params, function (err, data3) {
                                if (err) {
                                    //handle error
                                    //console.log(err);
                                    callback(null, {
                                        "status": "error",
                                        "data": [],
                                        "message": []
                                    });
                                } else {
                                    //code success
                                    console.log("delete",data3);
                                    callback(null, {
                                        "status": "Success",
                                        "data": data3,
                                        "message":"notification sent successfully"
                                    });
                                }
                            });
                        }
                    });
                }
            });
        }
        else {
            callback(null, {
                "status": "error",
                "data": [],
                "message": "You have not posted valid data."
            });
        }
    }

};

https://docs.aws.amazon.com/sns/latest/dg/sns-send-custom-platform-specific-payloads-mobile-devices.html

如何在Node JS中使用Amazon SNS向iOS设备发送VoIP推送通知


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接