我正在寻找创建 APNS(Apple 推送通知服务),服务器将在其中向 iOS 设备发送通知。
我可以使用 SAME 设备 token 和 SAME 证书通过 PHP 进行推送通知,但是,我想通过 Node JS 而不是 PHP 发送通知。
我有以下有效文件/证书可以帮助我入门:
- cert.pem
- key.pem
- aps_development.cer
- cert.p12
- key.p12,
- ck.pem
我一直在浏览多个资源/链接,例如:
这样做之后,我能够想出以下示例代码,其中 PASSWORD 代表 key.pem 的密码,TOKEN 代表我设备的 token :
var apn = require("apn");
var path = require('path');
try {
var options = {
cert: path.join(__dirname, 'cert.pem'), // Certificate file path
key: path.join(__dirname, 'key.pem'), // Key file path
passphrase: '<ASSWORD>', // A passphrase for the Key file
ca: path.join(__dirname, 'aps_development.cer'),// String or Buffer of CA data to use for the TLS connection
production:false,
gateway: 'gateway.sandbox.push.apple.com', // gateway address
port: 2195, // gateway port
enhanced: true // enable enhanced format
};
var apnConnection = new apn.Connection(options);
var myDevice = new apn.Device("<TOKEN>");
var note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
note.badge = 3;
note.sound = "ping.aiff";
note.alert = "You have a new message";
note.payload = {'msgFrom': 'Alex'};
note.device = myDevice;
apnConnection.pushNotification(note);
process.stdout.write("******* EXECUTED WITHOUT ERRORS************ :");
} catch (ex) {
process.stdout.write("ERROR :"+ex);
}
执行此代码时我没有收到任何错误,但问题是我的 iOS 设备上没有收到任何通知。我也尝试过设置 ca:null & debug:true (在选项 var 中)。但同样的事情也会发生。
再次,当我使用我拥有的 ck.pem 和设备 token 并将其与 PHP 一起使用时,它可以工作,但我无法使其在 Node JS 中工作。请帮忙!!
非常感谢!
Best Answer-推荐答案 strong>
您可能遇到了 NodeJS 本身的异步特性。我使用相同的 node-apn 模块取得了巨大的成功。但是您不只是像在 PHP 中习惯的那样直接调用它——这是一个不从 PHP->Node 映射的同步模型。您的进程在任何事情真正发生之前就退出了 - apnConnection.pushNotification(note); 是一个异步调用,在脚本返回/退出之前才刚刚开始。
如 node-apn 文档中所述,您可能希望“监听”apnConnection 上的其他事件。这是我用来注销连接创建后发生的各种事件的代码摘录:
// We were unable to initialize the APN layer - most likely a cert issue.
connection.on('error', function(error) {
console.error('APNS: Initialization error', error);
});
// A submission action has completed. This just means the message was submitted, not actually delivered.
connection.on('completed', function(a) {
console.log('APNS: Completed sending', a);
});
// A message has been transmitted.
connection.on('transmitted', function(notification, device) {
console.log('APNS: Successfully transmitted message');
});
// There was a problem sending a message.
connection.on('transmissionError', function(errorCode, notification, device) {
var deviceToken = device.toString('hex').toUpperCase();
if (errorCode === 8) {
console.log('APNS: Transmission error -- invalid token', errorCode, deviceToken);
// Do something with deviceToken here - delete it from the database?
} else {
console.error('APNS: Transmission error', errorCode, deviceToken);
}
});
connection.on('connected', function() {
console.log('APNS: Connected');
});
connection.on('timeout', function() {
console.error('APNS: Connection timeout');
});
connection.on('disconnected', function() {
console.error('APNS: Lost connection');
});
connection.on('socketError', console.log);
同样重要的是,您需要确保您的脚本在处理异步请求时保持运行。大多数时候,当您构建越来越大的服务时,您最终会得到某种事件循环来执行此操作,而 ActionHero、ExpressJS、Sails 等框架将为您执行此操作。
与此同时,您可以使用这个 super 粗略的循环来确认它,它只会强制进程保持运行,直到您点击 CTRL+C:
setInterval(function() {
console.log('Waiting for events...');
}, 5000);
关于ios - 带有 Node JS 的 APNS(Apple 推送通知服务),我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/36633188/
|