zoukankan      html  css  js  c++  java
  • iOS-----推送机制(下)

    推 送 机 制(下)

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

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

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

     

    在上图所示页面中,可以看到在“iOS Apps”栏目下包含了Certificates、Identifiers、Device、ProvisioningProfiles-----这些只有登录账号已经加入iOS Developer Program(iDP)的原因。

    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完全相同。

    接下来通过修改应用程序委托类来注册远程Push通知,并重写对应的方法来处理远程Push通知.

    通过上面介绍不难看出,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(“推送通知 happy new year。 ” + “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类文件。

    */

  • 相关阅读:
    HDU 4165 pills
    POJ 2125 Destroy The Graph
    POJ 2075 Tangled in Cables
    NYOJ Number SequenceProblem F
    PHP Eval研究笔记
    PHP 学习备忘(更新中)
    iOS学习笔记1 版本控制
    PHP全局缓存上栽的坑及其他【反面教材系列】
    iOS学习笔记2 Code Format
    iOS学习笔记4 垃圾回收初涉
  • 原文地址:https://www.cnblogs.com/congli0220/p/5098111.html
Copyright © 2011-2022 走看看