iOS-----推送机制(下)

推 送 机 制(下)

  1. 单击”从证书颁发机构请求证书”后,将会显示下图所示的对话框
  2. 输入电子邮件地址和经常使用名称,并选中“存储到磁盘”单选钮,而后单击“继续”按钮,该程序将会建立一个“Certificate Signing Request”(证书签名请求)文件,系统弹出下图所示的保存文件对话框

 

将证书签名请求文件保存到磁盘上,此处将该文件保存为“Push。cerSigningRequest”。java

  1. 使用浏览器打开 https://developer.apple.com/ios/manage/overview/index.action站点, 页面上将会提示用户输入开发者帐号\密码. 登陆成功后会看到以下说是的页面

 

在上图所示页面中,能够看到在“iOS Apps”栏目下包含了Certificates、Identifiers、Device、ProvisioningProfiles-----这些只有登陆帐号已经加入iOS Developer Program(iDP)的缘由。ios

  1. 单击“iOS Apps” →“Identifiers”→栏目下的”App IDS” 连接,系统将会显示以下图

 

上图列出了该开发者帐号当前拥有的全部App ID。数据库

  1. 单击页面右上角的“ +”按钮(添加App ID),系统打开以下图所示的页面

 

App ID的描述字符串能够随便填,但该App ID的惟一标识必需要记住,一般采用“公司域名+应用名”的格式编程

  1. 单击刚刚注册的App ID,能够看到该App ID支持的各类服务,以下图所示

 

  1. 从上图所示页面能够看出,该App ID并不支持Push Notification(推送通知)和iCloud服务。单击“Edit”按钮,进入编辑该App ID的页面以下图所示

 

  1. 勾选Push Notification右边的复选框-----这会启用该App ID的Push通知功能。勾选该复选框以后,Push Notifications下面的两个“Create Certificate…”按钮将会变成可用状态,其中第1个按钮用于建立开发阶段的证书,第2个按钮用于建立产品化阶段的证书。此处只须要建立开发阶段的证书,当须要正式发布该iOS应用时,须要建立产品化阶段的证书。
  2. 单击第1个“Create Certificate…”按钮,系统将会显示一个提示页面,告诉用户去建立一个CSR文件-----也就是前面咱们已经建立的“Certificate Signing Request”文件。因为咱们已将建立了该文件,所以直接单击“Continue”按钮,系统显示以下图所示的页面
 
  1. 单击“Choose File”按钮选择前面建立的Push.certSigningRequest文件,而后单击”Generate”按钮,系统将会为该App ID生成开发证书。成功生成开发证书以后,能够看到以下图所示的页面

 

  1. 成功生成App ID的开发证书以后,便可经过该页面中的“Download”按钮下载证书,也可返回系统证书列表页面去下载证书。此处先将该证书下载并保存到本地磁盘,该证书的文件名为“app_development.cer”
  2. 双击上一步下载获得的app_development.cer文件,OS X系统将会自动打开“钥匙串访问”应用程序,并将该证书添加到系统中。此时将能够在“钥匙串访问”应用程序中看到以下图所示的一行。

 

  1. 单击上上图所示页面中的“Done”按钮,系统返回证书列表页面,以下图所示

 

经过证书列表页面也能够下载指定的证书(只要点击指定的证书,页面就会显示“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应用处理远程通知比较简单。测试

  1. 在应用程序委托类的application:didFinishLaunchingWithOptions:方法中调用UIApplication的registerForRemoteNotificationTypes:注册远程Push通知。
  2. 重写应用程序委托类的如上3个方法

该示例的应用程序委托类实现部分代码

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. 将真机接入电脑
  2. 再次登陆 https://developer.apple.com/ios/manage/overview/index.action 站点,单击”Provisioning  Profiles”连接, 此时看到以下图所示的页面.

 

其中第1个Provisioning Profile是测试其余普通程序的Provisioning Profile,因为其余程序所谓App ID可支持通配符, 所以只要一个Provisioning Profile便可。但远程推送通知应用的App ID不能使用通配符,所以此处必须从新建立一个Provisioning Profile。

  1. 单击页面右上角的“ +”按钮,系统将会显示以下图所示的页面。

 

  1. 让用户选择Provisioning Profile的类型,此处支持建立开发阶段的Provisioning Profile,所以选中“Development” 分类下的“iOS App Development”单选钮。而后单击页面下方的“Continue”按钮,系统将会显示以下图所示的页面。

 

  1. 让用户选择须要为哪一个应用建立Provisioning Profile,此处选择前面刚刚建立的org.crazyit.PushTest应用。而后单击页面下方的”Continue”按钮,系统将会显示下图所示的页面

 

  1. 为Provisioning Profile选择证书,咱们可根据须要选择相应的证书,此处咱们直接勾选“Selector  All”复选框来选择两个证书。而后单击页面下方的“Continue”按钮,系统将会显示以下图所示的页面。
  2. 为Provisioning Profile 选择调试手机,咱们可根据须要选择相应的调试手机,此处咱们勾选“yeeku的iPhone”------这是个人调试手机,而后单击页面下方的“Continue”按钮,系统将会显示以下图所示的页面

 

 

  1. 为Provisioning Profile输入名称,而后单击页面下方的“Generate”按钮,喜用将会为咱们选中的iOS应用生成Provisioning Profile,将能够看到以下图所示的页面
  2. 单击“Download”按钮,系统将会把刚刚建立的Provisioning Profile下载到本地磁盘。仅保存到磁盘上将会获得一个PushTest.mobileprovision文件(该文件的扩展名是.mobileprovision, 但主文件名就是咱们在上图中输入的名称)。
  3. 单击本地磁盘上的PushTest.mobileprovision文件,OS X系统将会自动把该Provisioning Profile添加到对应的调试手机上。若是打开Xcode 的Organizer窗口(在Xcode中按“command+shift+2”快捷键便可),而后在该窗口的左边选中对应调试手机下面的Provisioning Profiles项,将能够看到以下图所示的界面。

 

  1. 在“查看调试手机”图片中能够看到两个Provisioning Profile,其中第1个Provisioning Profile就是刚刚建立并添加的Provisioning Profile;第2个Provisioning Profile是调试其余普通程序的Provisioning Profile,该Provisioning Profile对应的App Identifier使用了通配符,所以适用于其余全部的普通应用。
  2. 通过上面步骤,咱们已经为该远程推送应用准备了Provisioning Profile,接下来在Xcode中设置此Provisioning Profile便可。经过Xcode打开以下图所示界面,并按图所示的提示设置Provisioning Profile。

 

编译运行该应用(在真机上运行该应用),将能够看到以下图所示的提示框。

 

用户单击“好”按钮,将能够在Xcode的底部看到以下图所示的输出

 

此处iOS应用成功注册了远程推送通知,APNs返回了该设备的device token.在实际应用中, iOS应用应该经过网络将该device token发送给Push服务端程序, 此处咱们为了简化编程就不增长网络传输的代理代码了,而是直接将该device token复制到Push服务端程序.

 

开发Push服务端程序

Push服务端程序须要包含SSL链接证书和私钥。所以在开发Push服务端程序以前,须要先将它们准备好。

导入远程推送通知应用的私钥

  1. 打开OS X系统上的“钥匙串访问”应用,在该应用中找到名为“Push”的专用密钥----这就是私钥。而后右击该项,在弹出的快捷菜单单击“导出Push”菜单项,以下图所示

 

 此处之因此列有名为“Push”的公用密钥和专用密钥,是由于前面开发iOS客户端应用时使用证书助理建立了名字为Push的Certificate Signing Request文件,若是以前没有建立该Certificate Signing Request文件,或建立Certificate Signing Request时指定的名称不一样,那么此处将不会显示名为“Push”的公用密钥和专用密钥。

  1. 单击“导出Push”菜单项后,将会开始导出Push私钥,系统显示以下图所示的对话框。

 

  1. 为导出的Push私钥指定文件名(一般无须修改,直接就命名为Push.p12便可),并将该导出文件保存在本地磁盘的指定路径下。而后单击“存储”按钮,系统将会显示以下图所示的密码输入框----此处输入的密码就是该私钥文件的密码。

 

  1. 为Push私钥输入密码(此处输入user)后,单击“好”按钮,便可成功导出Push私钥。

此时咱们已经获得了Push服务端程序所须要的私钥和SSL链接证书(前面开发推送通知客户端时已经从Apple网站下载过开发证书,当时保存的开发证书名为aps_development.ver)。

接下来还须要将两个文件合并为一个文件,请按以下步骤进行:

  1. 进入app_development.cer文件所在的路径,执行以下命令:
  • opensel x509 –in aps_development.cer – inform der – out PushCert.pem – outform PEM  // ①

上面命令的做用是将aps_development.cer证书文件转换为PEM格式的证书文件,该命令将会生成一个PushCert.pem文件.

  1. 进入Push.p12文件所在的路径,执行以下命令:
  • opensel pkcs12 –nocerts – in Push.p12 – out PushKey.pem  // ②

上面命令的做用是将Push.p12私钥文件转换为PEM格式的私钥文件,该命令将会生成一个PushKey.pem文件。

运行上面命令一共会提示输入3次密码:第1次输入Push.p12私钥文件的密码(也就是咱们在“为Push输入密码”图片中输入的密码),只有输入该密码才可以让openssl命令读取该Push.p12私钥文件的内容;第2次输入的密码将会做为PushKey.pem文件的密码;第3次输入的密码用于确认第2次输入的密码-----此处依然输入”user”.

  1. 进入PushCert.pem、PushKey.pem文件所在的路径,执行以下命令:
  • openssl pkcs12 –export –in PushCert.pem –inkey PushKey.pem –out aps_developer_identity.p12 // ③

上面命令的做用是将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的步骤以下:

  1. 登陆该项目的官网:http://code.google.com/p/javapns/,选择页面上的“Downloads”标签页。此标签页中包含3个下载项。

        JavaPNS_2.2.jar:  该选项只是下载JavaPNS项目的核心JAR包.

        JavaPNS_2.2_javadoc.zip: 该选项只是下载JavaPNS项目的API文档

        JavaPNS_2.2_complete.zip: 该选项下载JavaPNS的完整压缩包,包括JavaPNS的核心JAR包、API文档和示例。

  1. 下载JavaPNS_2.2_complete.zip压缩包,解压该压缩包便可获得以下文件结构。

        doc:该文件夹下包含JavaPNS项目的各类文档。

        lib:该文件下包含bcprov-jdk15-146.jar、log4j-1.2.15.jar两个JAR包。这两个JAR包是

JavaPNS所依赖的JAR包。

        src:该文件夹下包含JavaPNS项目的源代码。

        JavaPNS_2.2.jar:这是JavaPNS项目的核心JAR包。

  1. 将JavaPNS解压路径下的JavaPNS_2.2.jar、bcprov-jdk15-146.jar、log4j-1.2.15.jar这3个JAR包添加到系统的类加载路径中便可完成JavaPNS的安装。
以下编写简单的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(); 

// 设置推送消息体 payload.addCustomAlertBody(“推送通知\n happy new year。\n” + “2016年顺顺利利,平平安安”); // 设置应用程序图标的小红圈中的数值 payload.addBadg(2); // 设置推送通知的提示声音 payload.addSound(“default”); // 发送推送通知 Push.payload(payload, “../aps_developer_identity.p12”, // 指定包含证书和私钥的文件 “user”, // 设置aps_developer_identity.p12文件的导出密码 false, // 是否为产品化阶段 deviceToken ); // } catch(Exception e) { e.printStackTrace(); } } }

 

上面程序中的第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类文件。

*/

相关文章
相关标签/搜索