用NodeJS实现APNS

http://dmyz.org/archives/472


APNS(Apple Push Notification service)可以给ios设备推送通知,直观表述就是当某个app在后台运行时,能弹出提示消息。相比Android来,只有这一套方案所以少了很多调研成本。标题写NodeJS,只是因为我们的生产环境是NodeJS,我也用其他语言调过,测试的库是这三个:node-apns(NodeJS) / PyAPNs(Python) / apns(Ruby)。本文的重点不是针对代码(因为确实没什么代码量),而是描述如何在Apple开发者中心请求证书、生成PEM文件、读取PEM文件和证书对APNs的沙盒发送请求,设备接收到Notification后进行处理这一系列流程的入门文章。

Tips & Preparations

APNs整套系统的原理文档中写得很详细,此处不赘述。只引用下图作为说明。
APNS

NodeJS要实现的是Provider(以下称服务)部分。

  • 1. 需要申请Apple开发者帐号,准备一台真实设备。模拟器没有Device Token,不能测试APNS;
  • 2. 收到提醒时,如果程序在前台打开会看不到提醒;
  • 3. 如果连续推送内容相同的提醒会失败。

Generate Certificate

Apple开发者中心创建App ID,创建时勾选App Services - Push Notifications。App ID Suffix选择通用App ID(Wildcard App ID)还是固定App ID(Explicit App ID)都可以,如果要开发多个App可以选择通用App ID,本文只做范例所以创建固定App ID,Name为dmyz,ID为org.dmyz.app。创建成功后在Identifiers - App IDs可以查看,点击之前创建的App ID,在展开的菜单中点击[Settings]按钮进入配置界面。

在配置界面中找到Push Notifications,点击[Create Certificate...]按钮创建SSL证书。Development SSL CertificateProduction SSL Certificate对应开发环境和生产环境,选择Development SSL Certificate

也可以点击左侧导航菜单的Certificates,来添加一个APNs证书。选择Apple Push Notification service SSL (Sandbox),之后的步骤相同。

第一步要先生成CSR(证书请求)文件,在Mac系统(本文是10.8)中打开实用工具 - 钥匙串 - 钥匙串访问 - 证书助理 - 从证书颁布机构请求证书,填入邮箱和名称(dmyz),选择[存储到磁盘],得到一个名为CertificateSigningRequest.certSigningRequest的证书请求文件,同时会在登陆 - 密钥里新增两条纪录,一个公用密钥和一个专用密钥:

回到Apple开发者中心的网页,点击[Continue]继续,上传生成的CertificateSigningRequest.certSigningRequest文件。完成这一步就可以得到.cert文件了。

Provisioning Profiles

在ios设备上运行程序需要Development Provisioning profile,这一步和APNs没有直接联系,已经在真实设备上配置成功的可以跳过。

App开发过程中要在真实设备上调试,需要Development Provisioning profileDevelopment Certificate

左侧导航菜单 - Devices,添加一个ios设备。UUID可以在iTunes里查到。然后增加一个iOS App Development的Certificate和Provisioning Profile:

最后得到一个证书文件,和一个.mobileprovision后缀的文件,就是Provisioning Profile文件了。安装证书文件,将.mobileprovision文件通过Xcode导入设备中。一般连接iso设备时Xcode会自动弹出,也可以在Xocde菜单的 Help - Xcode Help - Devices修改Provisioning Profile文件。下图是在Apple开发者中心创建的Provisioning Profile:

要保证App ID和程序的Target Properies - Bundle identifier的值相同,否则会报错Code Sign error: A valid provisioning profile matching the application’s Identifier ‘org.dmyz.app’ could not be found

Generate PEM

切换到左侧导航菜单的Certificates,找到之前生成的APNs Development iOS证书,点击[Download]按钮下载,得到aps_development.cer。安装后,在钥匙串访问中找到对应的证书。接下来要分别导出证书专用密钥。选中Apple Development IOS Push Services: org.dmyz.app上点击右键,选择[导出Apple Development IOS Push Services: org.dmyz.app],文件格式切换成.cer,导出为cert.cer。点击左侧▶展开它,可以看到名为dmyz,类别为[专用密钥]的这个子项,选中导出为key.p12

导出这两个文件后,用openssl进行处理:

$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
$ openssl pkcs12 -in key.p12 -out key.pem -nodes

会要求输入Import Password,如果导出时没有设置则为空。我在SO还找到另一种方法:

$ openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
$ openssl pkcs12 -nocerts -out key.pem -in key.p12
$ cat cert.pem key.pem > key.pem

主要差别是key没有加nodes参数,最后把两个文件合并了。测试过可以通过。执行第二条命令时需要输入PEM pass phrase,至少4个字符。

现在得到key.pemcert.pem文件了,无论服务是NodeJS, Python还是Ruby,这只需要这两个文件。

Coding

通知计数、点击通知执行的函数等细节设置和Location notification相同,区别是要指定Device。Xcode中打开项目的AppDelegate.m文件中增加一个函数,来获取设备Token:

1
2
3
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"deviceToken: %@", deviceToken);
}

最后,安装apn,把key.pemcert.pem拷贝到项目目录。执行以下代码可以推送通知到指定设备,截图是当程序在后台运行且屏幕锁定时收到通知的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var apn = require('apn');
 
var token = 'a788a70f...79ecc6145'; //长度为64的设备Token
 
var options = { "gateway": "gateway.sandbox.push.apple.com" },
    apnConnection = new apn.Connection(options),
    device = new apn.Device(token),
    note = new apn.Notification();
 
note.expiry = Math.floor(Date.now() / 1000) + 60;
note.badge = 3;
note.alert = "动漫驿站 \n点击查看更新的1篇文章";
note.payload = {'messageFrom': 'Caroline'};
 
apnConnection.pushNotification(note, device);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
以下是使用NodeJS实现一套卡密验证系统的步骤: 1. 首先,需要创建一个Express应用程序来处理HTTP请求和响应。可以使用以下命令创建一个新的Express应用程序: ``` npm install express-generator -g express myapp cd myapp npm install ``` 2. 接下来,需要创建一个数据库来存储卡密和相关的信息。可以使用MongoDB来实现,也可以使用其他的数据库。可以使用以下命令安装MongoDB驱动程序: ``` npm install mongodb --save ``` 3. 创建一个卡密模型来定义卡密的结构和方法。可以使用以下代码创建一个名为Card的模型: ``` var mongoose = require('mongoose'); var cardSchema = new mongoose.Schema({ code: { type: String, required: true, unique: true }, value: { type: Number, required: true }, used: { type: Boolean, default: false }, createdAt: { type: Date, default: Date.now }, updatedAt: { type: Date } }); cardSchema.pre('save', function(next) { this.updatedAt = new Date(); next(); }); module.exports = mongoose.model('Card', cardSchema); ``` 4. 创建一个路由来处理HTTP请求。可以使用以下代码创建一个名为cards的路由: ``` var express = require('express'); var Card = require('../models/card'); var router = express.Router(); router.post('/validate', function(req, res) { var code = req.body.code; Card.findOne({ code: code }, function(err, card) { if (err) { return res.status(500).send(err); } if (!card) { return res.status(404).send('Card not found'); } if (card.used) { return res.status(409).send('Card has already been used'); } card.used = true; card.save(function(err) { if (err) { return res.status(500).send(err); } res.send({ value: card.value }); }); }); }); module.exports = router; ``` 5. 在应用程序中使用路由。可以使用以下代码将路由添加到应用程序中: ``` var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var cards = require('./routes/cards'); var app = express(); mongoose.connect('mongodb://localhost/cards'); app.use(bodyParser.json()); app.use('/cards', cards); var server = app.listen(3000, function() { console.log('Listening on port %d', server.address().port); }); ``` 6. 运行应用程序。可以使用以下命令启动应用程序: ``` node app.js ``` 以上就是使用NodeJS实现一套卡密验证系统的步骤。可以根据实际需求对代码进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值