如何使用Node JS中的Amazon SNS将VoIP推送通知发送到iOS设备

我正在尝试使用名为sns-mobile和Amazon SNS API的NodeJS程序包,将App推送通知直接从App服务器发送到iOS设备。

但是,当我尝试使用下面的代码发送VoIP推送,这是我得到的错误信息。 有人可以build议我哪里出错,我已经花了近半天的时间来解决这个问题。

无效参数:JSON必须包含“默认”或“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); }); }); 

以下是使用其设备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]);