最近的项目需要用到iOS的push功能,在配置push功能的过程中遇到了一些不清楚的地方,经过查阅资料和思考,已有初步认识,下面进行一下梳理,我们的服务器端用的是Facebook的Parse。

 

完整的push流程是这样的,服务器端将信息传递给APNS(Apple Push Notification Service),再由APNS将信息push到目标设备。

 

服务器——APNS   

服务器与APNS之间是通过SSL(Secure Sockets Layer)协议进行通信的,简单的原因应该是这样的,Apple的推送服务器肯定不能随便接受外界的push请求,只有经过它的认证才可以,于是我们的服务端程序需要有一个Apple授予的SSL证书。这个证书怎样获得呢?分几步:

 

1.生成SSL证书请求文件CertificateSigningRequest.certSigningRequest

 

  • 打开Keychain Access
  • 选择Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority…
  • 填写Email

 

       

ios 推送消息 java做推送服务端 ios推送机制苹果服务器_SSL

 

 

2.将SSL证书请求文件上传至 Apple Developer Member Center以取得真正的SSL证书,我们假设已经创建好了App ID

 

 

       

ios 推送消息 java做推送服务端 ios推送机制苹果服务器_App_02

 

 

  • 向下滑动页面至 Push Notifications,在这里我们就可以创建即将配置在服务器上的SSL证书了,开发证书和发布证书申请的流程是一样的,我们这里以开发证书为例。 

 

 

          

ios 推送消息 java做推送服务端 ios推送机制苹果服务器_ios 推送消息 java做推送服务端_03

      

 

 

  • 在下一页点击Continue,我们将会被要求上传之前生成的Certificate Signing Request (CSR)文件,即CertificateSigningRequest.certSigningRequest。
  • 上传后点击Generate,至此SSL证书便生成出来了,我们需要将它下载到本地,本地便有了这样一个文件aps_development.cer。

 

3.将SSL证书配置在服务器端

虽然本地已经有了服务器端所需的SSL证书aps_development.cer,但是它并不能直接送给服务器端,还需要一点工序,如何加工请看下面的流程。

 

  • 双击SSL证书aps_development.cer,它将自动导入到Keychain中,注意观察双击前后Keychain Access中的变化。
  • 在Keychain Access的"My Certificates"分类中右击刚才导入SSL证书(名字是Apple Development iOS Push Services:App的Bundle ID),选择图中的Export。

 

    

ios 推送消息 java做推送服务端 ios推送机制苹果服务器_ios 推送消息 java做推送服务端_04

 

 

  • 选择Export后会出现一个页面,以便我将证书以.p12格式导出,.p12是服务器端所需的文件,至少是Parse所需的。*注意*,一定确保上一步中我们选中了"My Certificates"分类,否则在这一步中.p12格式是disable的。终于得到了服务器端所要的“Apple签证”,按照服务器端的配置要求去配置吧,在Parse中只需将这个.p12文件上传就可以了。

 

        

ios 推送消息 java做推送服务端 ios推送机制苹果服务器_服务器端_05

 

 

至此,服务器端——APNS已打通,我们继续考虑APNS——设备之间的通信。

 

 

APNS——设备(设备将Push信息分发至App)

 

APNS怎么知道要将服务器端要将信息push给哪个设备或是哪一群设备呢?显然是服务器端将目标设备告诉了APNS,经了解,APNS要求服务器端以JSON(JavaScript Object Notation) 格式将目标设备的Device ID集合告诉它,然后它再将push信息发到相应设备上,push信息到了设备,设备再根据push信息内容把push信息指定到具体的App。于是,设备中安装的App也需要有一些能够验明正身的东西,这个东西肯定也是由Apple Developer Member Center提供的。

 

1. 创建Provisioning Profile

 

 

2. 配置App

  • 将provisioning profile下载到本地,双击,自动导入到Xcode。
  • 在Xcode中设置code signing。

 

ios 推送消息 java做推送服务端 ios推送机制苹果服务器_App_06

 

 

 

到这里,App的验明正身工作已经做完了,服务器端——APNS——设备(准确的说是App)全部打通,剩下就是代码层面的工作了。最后总结一下Apple Push的配置,想要实现Server——APNS——App的Push通信,就要让APNS认识Server和App,于是需要两个物件,一个是给Server的SSL证书(最终形式为.p12),一个是给App的provisioning profile,这两个物件肯定都是要向Apple申请的,这便是上面一系列流程要达到的目的。

 

另外,再补充一点关于CertificateSigningRequest.certSigningRequest文件的事情,这个文件是我们向Apple申请证书的证书请求文件,在Keychain Access中可以随意生成,那么,每次制作证书都要生成一次吗?不是的,这个CertificateSigningRequest.certSigningRequest文件中可能只是包含一些Mac设备信息,时间戳等,在同一台Mac上生成的多个CertificateSigningRequest.certSigningRequest文件可能只是时间戳不同,其他是一样的,所以它只需生成一个,之后做各种SSL证书均可使用。