iOS推送,从客户端到服务器

注:xcode版本为6.1,服务器是Node.js。

关于iOS的推送原理,这里就不多写了。这里主要写的是如何实现iOS推送,包括客户端和服务器的实现。

iOS推送大概可以分为三个部分。客户端、证书申请、服务器。如果把这三个部分理清楚,那做起来也是极其容易的。

客户端

客户端的代码很少,在 AppDelegate 的 didFinishLaunchingWithOptions 里写上注册通知的代码。

1
2
3
4
5
6
7
8
9
10
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 注册推送通知
{
[application registerForRemoteNotificationTypes:
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound];
}
}

对应的,注册成功和失败有两个回调。

1
2
3
4
5
6
7
8
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
NSString *token = [[newDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
}

注册成功后会返回一个32bytes的newDeviceToken,看情况我们需要把它转换位字符串使用。

这样,客户端的代码就完成了,就是这么简单!

但是,如果你现在就要测试,那么肯定会注册失败,因为我们还有很多东西没做呢。

证书

和申请开发者证书类似,先在本地生成一个请求证书。

打开Keychain Access,左上角Keychain Access - Certificate Assistant - Request a Certificate From a Certificate Authority。在User Email Address填上邮箱地址,然后Save to disk就可以了。

进入苹果的开发者平台,我们需要在这里处理证书。

这里处理证书有两种方法,一种是先添加一个证书再将其添加到需要申请的应用设置里,另一种是直接通过修改应用的设置,在里面完成证书生成的过程。

第一种方法中,自己生成证书的类型一定要选择Push对应的类型,包括开发的和发布的。

下面介绍第二种方法。

在App IDs选项里,选中我们已经创建好的App,选择Edit编辑它的内容,里面有一项Push Notifications,将其勾选,可以看到下面有两个选项,分别对应开发和发布版本的证书,我们先选择开发版的。如果要打包发布版本的,则需要重走整个流程,把证书重新弄一遍,但要选择发布版的添加证书。

点击Create Certificate,跟着提示把刚才申请的证书上传,最后生成一个和推送相关的证书,将其Download下来。

然后再申请Provisioning Profile,这个跟申请开发者的profile流程一样,最后把profile下载下来,打开xcode并双击profile添加进去。

接下来就要处理刚才下载下来的证书了。

双击该证书,打开Keychain Access,找到对应的push证书,右键选择Export,后缀选择为cer并导出。

再次点击该证书左边的下三角,看到private key,右键选择Export,后缀选择为p12并导出。

这样,我们就有后缀为cer和p12的两个文件了。

在终端(mac里面的terminal)进入到这两个文件的位置,执行下面两句命令。

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

其中cert.cer和key.p12是我们刚才创建的两个文件,而最后会得到cert.pem和key.pem两个新的文件。

如果是发布版,则需要照前面的流程再次生成两个pem文件。

到这里,证书就弄完了,将证书上传到服务器吧。

服务器

这里服务器是用Node.js实现的。前提是你的Node服务器已经搭好了。

先看代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var options = {
"cert": "./push_ssl/cert.pem",
"key": "./push_ssl/key.pem",
"gateway": "gateway.sandbox.push.apple.com",//"gateway.push.apple.com",
"port": 2195
};
var apnConnection = new apn.Connection(options);
var device = new apn.Device(token);
var note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 60;
note.badge = 3;
note.alert = message;
note.sound = 'default';
note.payload = {'messageFrom': 'Caroline'};
note.device = device;
apnConnection.pushNotification(note, device);

首先,这里需要用到apn。在前面需要定义:

1
var apn = require('apn');

在服务器外面需用执行:

1
npm install apn

导入对应的库。

cert.pem 和 key,pem是刚才生成的两个文件,需要提交的服务器上,并写上正确的路径。

gateway,如果是开发证书,则需要写上sandbox,如果是发布证书,则不需要,和注释里的一样。

token是在客户端里得到的字符串,你必须通过某种方式发送到服务器。执行完pushNotification之后,通知会推送到该token对应的设备上。

message就是要发送的内容。

不要忘记打包的时候用上我们生成的provisioning profile,这样才能够正确地使用证书。