|
将证书签名请求文件保存到磁盘上,此处将该文件保存为“Push。cerSigningRequest”。java
在上图所示页面中,能够看到在“iOS Apps”栏目下包含了Certificates、Identifiers、Device、ProvisioningProfiles-----这些只有登陆帐号已经加入iOS Developer Program(iDP)的缘由。ios |
上图列出了该开发者帐号当前拥有的全部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彻底相同。app
|
接下来经过修改应用程序委托类来注册远程Push通知,并重写对应的方法来处理远程Push通知.ide
|
|
经过上面介绍不难看出,iOS应用处理远程通知比较简单。测试 |
|
该示例的应用程序委托类实现部分代码 |
AppDelegate.m - (BOOL)application: (UIApplication*) application didFinishLauchingWithOptions: (NSDictionary*)LaunchingOptions { // 注册远程推送通知 [[UIApplication shareApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert ]; return YES; // ① } - (void)application: (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData*)pToken { NSLog(@”注册成功: %@”, pToken); // 注册成功,应该将该device token发送给Push服务端程序 // Push服务端程序应该将该token保存到数据库中, 以备之后重复使用 } - (void)application: (UIApplication*)application didFailToRegisterForRemoteNotifications WithError: (NSError*) error { NSLog(@”注册失败: %@”, error); } - (void)application: (UIApplication*)application didReceiveRemoteNotification: (NSDictionary*) userInfo { // 处理推送消息 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@” 通 知 ” message:@”个人消息” delegate:self cancelButtonTitle:@”取消 ” otherButtontitles: nil]; [alert show]; NSLog(@”%@”, userInfo); } … @end
|
上面程序的第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服务端程序须要包含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 { public static void main (String[] args) { // 向执行设备发送Push通知的device token // 不一样设备的device token应该由iOS应用经过网络发送给服务端程序 // 服务端程序应该将这些device token保存在服务器中 // 而后经过循环向每一个device token发送Push通知 String deviceToken = “60c70bb185cd50edfaa430”; // ① try { // 建立PushNotificationPayload PushNotificationPayload payload = new PushNotificationPayload();
|
上面程序中的第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类文件。 */ |