NodeJS Node-apn实现为守护进程

时间:2012-11-02 20:42:43

标签: iphone ios node.js push-notification apple-push-notifications

我有一个node-apn nodejs脚本在AmazonWS上作为守护进程运行。守护进程运行良好,脚本保持运行状态并在发生故障时返回,但我相信我正在进行同步执行并退出node.js的问题。当我使用process.exit()释放进程时;即使所有console.logs输出说他们已经发送了我的消息,他们也从未在手机上收到。我决定删除退出并让程序在执行后“挂起”并且所有消息都已成功发送。这导致我使用ASYNC函数执行以下实现,但似乎也发生了相同的结果。有人能提供这方面的见解吗?从APN或其他任何地方都没有抛出任何错误。

function closeDB()
{ 

    connection.end(function(err) {
    if (err) {
        console.log("ERROR: " + util.inspect(err, false, 5));
        process.exit(1);
    } 

    console.log("APNS-PUSH: COMPLETED.");
});

setTimeout(function(){process.exit();}, 50);

} // End of closeDB()

function apnsError(err, notification)
{
console.log(err);
console.log(notification);
closeDB();
}  

function async(arg, callback) 
{
apnsConnection.sendNotification(arg);
console.log(arg); 
setTimeout(function() { callback(1); }, 100);
} 

/**
* Our MySQL query callback.
*/
function queryCB(err, results) 
{

//error in our all, report and exit
if (err) {
    console.log("ERROR: " + util.inspect(err, false, 5));
    closeDB();
} 

if(results.length == 0)
{
    closeDB();
}

var notes = [];
var count = 0;

try {
    for( var i = 0; i < results.length; i++ ) {
        var myDevice = new apns.Device(results[i]['udid']);

        var note = new apns.Notification();

        note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
        note.badge = results[i]["notification_count"];
        note.sound = "ping.aiff";
        note.alert = results[i]["message"];
        note.device = myDevice;

        connection.query('UPDATE `tbl_notifications` SET `sent`=1 WHERE `id`=' + results[i]["id"] , function(err, results) {
                if(err)
                {
                    console.log("ERROR: " + util.inspect(err, false, 5));
                }
            });

        notes.push(note);
    }
} catch( err ) {
    console.log('error: ' + err)
}

console.log(notes.length);

notes.forEach(function(nNode) {
    async(nNode, function(result) {
        count++;
        if(count == notes.length) {
            closeDB();
        }
    })
});         

} // End of queryCB()

2 个答案:

答案 0 :(得分:0)

我有同样的问题,杀死进程也杀死了打开的套接字连接,并且不允许发送通知。我提出的解决方案不是一个理想的解决方案,但它也适用于您的情况。我查看了node-apn代码,发现Connection对象继承自EventEmitter,因此您可以像这样监视对象上的事件:

var apnsConnection = new apn.Connection(options)

apnsConnection.sendNotification(notification)

apnsConnection.on('transmitted', function(){
    console.log("Transmitted")
    callback()
})

apnsConnection.on('error', function(){
    console.log("Error")
    callback()
})

这是监视通知发送的套接字,所以我不知道确定通知何时成功传递给Apple的APNS服务器有多准确,但它对我来说效果很好。

答案 1 :(得分:0)

您遇到此问题的原因是,当您使用#pushNotification时,它会缓冲模块内的通知并处理异步发送。

侦听“已发送”有效,并且在将通知写入套接字时会发出此消息。但是,如果您的目标是在发送所有通知后关闭套接字,那么完成此操作的最简单方法是在创建连接时使用connectionTimeout属性。

只需将connectionTimeout设置为大约1000(毫秒)左右,假设您没有打开其他连接,则该过程将自动退出。或者,您可以在timeout事件上设置事件监听器,然后从那里调用process.exit()