APNS的推送机制
⾸首先我们看⼀一下苹果官⽅方给出的对ios推送机制的解释。如下图
Provider就是我们⾃自⼰己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器。
上图可以分为三个阶段:第⼀一阶段:应⽤用程序的服务器端把要发送的消息、⺫⽬目的iPhone的标识打包,发给APNS。
第⼆二阶段:APNS在⾃自⾝身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应⽤用程序,并且按照设定弹出Push通知。
APNS推送通知的详细⼯工作流程
下⾯面这张图是说明APNS推送通知的详细⼯工作流程:
根据图⽚片我们可以概括⼀一下:
1. 应⽤用程序注册APNS消息推送。
2. iOS从APNS Server获取devicetoken,应⽤用程序接收device token。3. 应⽤用程序将device token发送给程序的PUSH服务端程序。
4. 服务端程序向APNS服务发送消息。
5. APNS服务将消息发送给iPhone应⽤用程序。
远程推送操作过程简介
1. App启动过程中,使⽤用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函
数
application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
会被触发,App可以得到deviceToken,该token就是⼀一个与设备相关的字符串.
-
App获取到DeviceToken后,将DeviceToken发送给⾃自⼰己的服务端。
-
服务端拿到DeviceToken以后,使⽤用证书⽂文件,向苹果的APNS服务器发起⼀一个SSL连接。连接成功之后,发送⼀一段JSON串,该JSON串包含推送消息的类型及内容。
-
苹果的APNS服务器得到JSON串以后,向App发送通知消息,使得App的回调函数
application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
userInfo中即可得到推送消息的内容。
⽤用到的证书⽂文件及⽣生成过程
被调⽤用,App从
-
certSigningRequest⽂文件,该⽂文件在MAC系统中⽣生成,⽤用于在Apple⺴⽹网站上申请推送证书⽂文件。 ⽣生成过程: 打开应⽤用程序中的“钥匙串访问”软件,从菜单中选择 “钥匙串访问”-》“证书助理”-》“从证书颁发机构请求证书”,邮箱和名称随便填写,然后选择保存到磁盘,就可以在本地⽣生成⼀一个CertificateSigningRequest.certSigningRequest⽂文件。
-
注册⼀一个⽀支持push的app id,后⾯面会⽤用到。 ⽣生成过程: 进⼊入developer.apple.com,选择member center - Certificates, Identifiers & Profiles - Identifiers- App Ids,然后选择注册app id,设置appid名称,同时,app id suffix⼀一栏必须选择explicit app id,然后设置bundleid,最后勾选 App Services中的 Push Notifications,这样就可以注册⼀一个⽀支持push的aphid。
-
推送证书cer⽂文件,该⽂文件在developer.apple.com中⽣生成,⽤用于⽣生成服务端需要的⽂文件。⽣生成过程: 进⼊入developer.apple.com,选择member center - Certificates, Identifiers &Profiles - Certificates,然后选择创建certificate,类型分为Development和Product。这⾥里以Development为例,选择Apple Push Notification service SSL (Sandbox) ,然后下⼀一步,选择之前⽣生成的⽀支持push的AppId,然后下⼀一步,提交之前创建的CSR⽂文件,再下⼀一步就可以⽣生成cer⽂文件,然后保存到本地。
-
⽣生成服务端使⽤用的证书⽂文件。如果是使⽤用⺴⽹网上的mac 版PushMeBaby⼯工具,在mac机器上进⾏行推送消息的发送,那么有上⾯面的cer⽂文件就够了。如果是使⽤用PHP、java/c#开发⾃自⼰己的服务端,那么还需要将上⾯面的cer⽂文件做⼀一个转换,⽣生成pem⽂文件或者p12⽂文件。
-
⽣生成Xcode使⽤用的provisioning⽂文件,该⽂文件⽤用于真机调试。⽣生成过程:进⼊入developer.apple.com,选择member center - Certificates, Identifiers & Profiles -Provisioning Profiles,然后选择创建Provisioning file,接着选择iOS App Development ,下⼀一步选择AppId,选中之前建⽴立的⽀支持push的appid,接着下⼀一步选择⽀支持push的certificate,下⼀一步勾选需要⽀支持的device id,最后⼀一步设置provisioning⽂文件的⽂文件名,这样provisioning⽂文件就⽣生成了。
客户端的开发
⾸首先下载前⾯面建⽴立的cer⽂文件和provisioning⽂文件,双击,导⼊入到xcode中,在build setting中code signing⼀一栏⾥里选择这两个⽂文件的名称,这样就可以将⽀支持push的app部署到真机中。然后是要处理推送消息。
客户端对推送消息的处理分两种情况:
1. 在App没有运⾏行的情况下,系统收到推送消息,⽤用户点击推送消息,启动App。此时,不会执⾏行前⾯面提到的 didReceiveRemoteNotification 函数,⽽而是在App的applicationDidFinishLaunching函数中处理推送,通过以下代码可以获取推送消息中的数据:
1. 当APP处于前台时,系统收到推送消息,此时系统不会弹出消息提⽰示,会直接触发application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary)userInfo函数,推送数据在userInfo字典中。
当App处于后台时,如果系统收到推送消息,当⽤用户点击推送消息时,会执⾏行application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo函数, 此时
NSDictionary *userInfo =[launchOptions objectForKey:UIApplicationLaunchOp
tionsRemoteNotificationKey];
AppDelegate中函数执⾏行的顺序为:
、
applicationWillEnterForeground
application:didReceiveRemoteNotification
、
applicationDidBecomeActive