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

来源:互联网 发布:加盟淘宝店 编辑:程序博客网 时间:2024/05/16 09:10

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


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

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

客户端


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


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    // Override point for customization after application launch.        // 注册推送通知    {        [application registerForRemoteNotificationTypes:         UIRemoteNotificationTypeBadge |         UIRemoteNotificationTypeAlert |         UIRemoteNotificationTypeSound];    }}

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


- (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就可以了。

进入苹果的开发者平台https://developer.apple.com/account/ios/certificate/certificateList.action,我们需要在这里处理证书。

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

第一种方法中,自己生成证书的类型一定要选择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)进入到这两个文件的位置,执行下面两句命令。

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


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

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

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


服务器

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

先看代码。

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。在前面需要定义:

var apn = require('apn');

在服务器外面需用执行:

npm install apn

导入对应的库。

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

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

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

message就是要发送的内容。

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




0 0