推 送 机 制(下)
|
将证书签名请求文件保存到磁盘上,此处将该文件保存为“Push。cerSigningRequest”。
在上图所示页面中,可以看到在“iOS Apps”栏目下包含了Certificates、Identifiers、Device、ProvisioningProfiles-----这些只有登录账号已经加入iOS Developer Program(iDP)的原因。 |
上图列出了该开发者账号当前拥有的所有App ID。 |
App ID的描述字符串可以随便填,但该App ID的唯一标识必须要记住,通常采用“公司域名+应用名”的格式 |
|
|
|
|
通过证书列表页面也可以下载指定的证书(只要点击指定的证书,页面就会显示“Revoke”、“Download”两个按钮,其中“Revoke”按钮用于删除证书,“Download”按钮用于下载证书)。 经过上面步骤,我们已经成功为Push客户端创建了一个支持Push通知的App ID,并下载、安装了该App ID的开发证书 |
现在开始开发Push‘客户端应用。新建一个Single View Application, 该应用的”Bundle Identifier”必须与前面注册的App ID完全相同.如下图所示是新建应用对话框. 该对话框的填写非常关键,各位务必保证该用用的“Bundle Identifier”与前面注册的App ID完全相同。 |
接下来通过修改应用程序委托类来注册远程Push通知,并重写对应的方法来处理远程Push通知. |
通过上面介绍不难看出,iOS应用处理远程通知比较简单。 |
|
该示例的应用程序委托类实现部分代码 |
AppDelegate.m - (BOOL)application: (UIApplication*) application |
上面程序的第1行代码注册了远程Push通知,接下来程序实现了UIApplicationDelegate协议中与远程推送通知相关的3个方法-----注册Push通知成功、失败时激发的方法,以及收到远程Push通知时激发的方法 |
远程推送通知的应用必须在真机上测试,而且客户端应用还需要Provisioning Profile,这个东西也必须通过Apple网站创建、下载。为远程推送通知应用创建、下载Provisioning Profile请按如下步骤进行。
其中第1个Provisioning Profile是测试其他普通程序的Provisioning Profile,由于其他程序所谓App ID可支持通配符, 因此只要一个Provisioning Profile即可。但远程推送通知应用的App ID不能使用通配符,因此此处必须重新创建一个Provisioning Profile。
编译运行该应用(在真机上运行该应用),将可以看到如下图所示的提示框。 用户单击“好”按钮,将可以在Xcode的底部看到如下图所示的输出 此处iOS应用成功注册了远程推送通知,APNs返回了该设备的device token.在实际应用中, iOS应用应该通过网络将该device token发送给Push服务端程序, 此处我们为了简化编程就不增加网络传输的代理代码了,而是直接将该device token复制到Push服务端程序. |
开发Push服务端程序
Push服务端程序需要包含SSL连接证书和私钥。因此在开发Push服务端程序之前,需要先将它们准备好。
导入远程推送通知应用的私钥 |
此处之所以列有名为“Push”的公用密钥和专用密钥,是因为前面开发iOS客户端应用时使用证书助理创建了名字为Push的Certificate Signing Request文件,如果之前没有创建该Certificate Signing Request文件,或创建Certificate Signing Request时指定的名称不同,那么此处将不会显示名为“Push”的公用密钥和专用密钥。
|
|
此时我们已经得到了Push服务端程序所需要的私钥和SSL连接证书(前面开发推送通知客户端时已经从Apple网站下载过开发证书,当时保存的开发证书名为aps_development.ver)。 |
接下来还需要将两个文件合并为一个文件,请按如下步骤进行:
上面命令的作用是将aps_development.cer证书文件转换为PEM格式的证书文件,该命令将会生成一个PushCert.pem文件.
上面命令的作用是将Push.p12私钥文件转换为PEM格式的私钥文件,该命令将会生成一个PushKey.pem文件。 运行上面命令一共会提示输入3次密码:第1次输入Push.p12私钥文件的密码(也就是我们在“为Push输入密码”图片中输入的密码),只有输入该密码才可让openssl命令读取该Push.p12私钥文件的内容;第2次输入的密码将会作为PushKey.pem文件的密码;第3次输入的密码用于确认第2次输入的密码-----此处依然输入”user”.
上面命令的作用是将PushCert.pem、PushKey.pem 合并为一个aps_developer_identity.p12 运行上面命令一共会提示输入3次密码:第1次输入PushKey.pem文件的密码(也就是我们在第2 步中为PushKey.pem文件输入的密码),只有输入该密码才可让openssl命令读取该PushKey.pem文件的内容;第2次输入的密码将会作为aps_developer_identity.p12文件的密码;第3次输入的密码用于确认第 2次输入的密码-----此处依然输入“user”。 整个运行过程如下图所示 |
Java领域有一个JavaPNS开源项目用于开发Apple Push Notification Service Provider,借助于该项目即可非常方便地开发远程推送通知的服务端程序。下载和安装JavaPNS的步骤如下:
JavaPNS_2.2.jar: 该选项只是下载JavaPNS项目的核心JAR包. JavaPNS_2.2_javadoc.zip: 该选项只是下载JavaPNS项目的API文档 JavaPNS_2.2_complete.zip: 该选项下载JavaPNS的完整压缩包,包括JavaPNS的核心JAR包、API文档和示例。
doc:该文件夹下包含JavaPNS项目的各种文档。 lib:该文件下包含bcprov-jdk15-146.jar、log4j-1.2.15.jar两个JAR包。这两个JAR包是 JavaPNS所依赖的JAR包。 src:该文件夹下包含JavaPNS项目的源代码。 JavaPNS_2.2.jar:这是JavaPNS项目的核心JAR包。
|
如下编写简单的Java源文件,即可实现远程推送通知的服务端程序 PushSever.java import javapns.Push; import javapns.notification.PushNotificationPayload; public class PushServer { |
上面程序中的第1行红色字代码就是指定iOS设备的device token----在实际应用中, 该device token应该由iOS客户端通过网络发送给服务端程序,此处为了简单起见,我们直接将iOS设备的device token复制、粘贴到此处。 上面程序中的第2段红色字代码使用了Push类的payload()类方法来发送远程推送通知,发送推送通知指定了包含证书和私钥的文件、aps_developer_identity.p12文件的导出密码。 将JavaPNS解压路径中包含的JavaPNS_2.2.jar、bcprov-jdk15-146.jar、log4j-1.2.15.jar复制到该Java源文件的同一路径下,然后使用如下命令来编译该Java源文件: java –encoding utf-8 –cp JavaPNS_2.2.jar PushServer.java // ① 上面命令用于编译PushServer.java文件,该命令使用了-cp选项将JavaPNS_2.2.jar临时添加到类加载路径中. 使用如下命令运行PushServer: java –cp .: JavaPNS_2.2.jar:bcprov-jdk15-146.jar:log4j-1.2.15.jar PushServer // ② 上面命令用于运行PushServer,并使用了-cp选项将JavaPNS_2.2.jar、bcprov-jdk15-146.jar和log4j-1.2.15.jar临时添加到类加载路径中 /* 注意: 若在UNIX、Linux、OS X系统上执行上面的java命令,-cp选项值中的各JAR包的分隔符为英文冒号;如果在Windows系统中执行上面的java命令,则应将-cp选项值中的各JAR包的分隔符改为英文分号。而且,不要忘记了-cp选项值开始的一点(.),这个点(.)代表了当前路径,用于告诉系统在当前路径下搜索PushServer类文件。 */ |