1. 推送从服务器到达目标设备过程
阶段一:服务端把要发送的消息和目标iOS设备的DeviceToken打包,发送给APNS;备注:DeviceToken不是一成不变的
阶段二:APNS在自身的已注册Push服务的IOS设备列表中,根据DeviceToken查找对应iOS设备,并将消息发送到IOS设备;
阶段三:IOS设备把发送的消息传递给对应的应用程序。
2. 实现推送以及程序不同运行状态时收到推送的相应处理
主要介绍程序分别在前台、后台和关闭时收到推送的处理和用户从桌 面进入和从通知栏进入的区别。对于证书的配置就不再赘述,网上有很多教程。本文是基于你的证书都已配置好,并且可以收到推送的情况。程序无论在前台、后台还是关闭的时候时都可以收到推送的,那收到推送的情况就可以分为三种:
1.程序在前台时收到推送:
在前台收到通知时,会调用下面这个方法,可以在这个方法里面实现收到通知时刷新或跳转界面的功能;程序在前台收到推送时通知栏不会弹出推送信息
-(void)application:(UIApplication*)applicationdidReceiveRemoteNotification:(NSDictionary*)userInfo{}
2.程序在后台时收到推送:
当程序在后台收到推送时,如果info.plist中配置了UIBackgroundModes会调用
-(void)application:(UIApplication*)applicationdidReceiveRemoteNotification:(NSDictionary*)userInfofetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler{ }
如果用户点击通知栏信息进入程序会调用情况1中的方法,所以在情况1的方法里面需要根据程序在前台还是后台application.applicationState来执行不同操作
3.当程序关闭时收到推送:
程序关闭时收到推送时,用户点击通知栏信息进入应用的时会调用
-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{}
并且此时的launchOptions是有值的,即推送过来的信息。可以通过判断launchOptions是否为空,来执行你想要的操作。
- 4.关于未读消息数量角标
设置角标[UIApplication sharedApplication].applicationIconBadgeNumber=badgeNum;
这个方法的确可以设置应用程序的角标的数值。但是当程序关闭时,收到推送后我们要怎么改变桌面程序角标的数值呢?这个设置角标的方法写在哪里呢?所以我觉得最好的办法就是让服务推送过来的信息里加上'badge' = 88这个键值对。无论是你程序在后台还是关闭,只要推送过来的消息里面有这个键值对,设备就会自动的为你设置好角标的数值。我们要做的就是在我们阅读完一条消息的时告诉服务器,并且将[UIApplication sharedApplication].applicationIconBadgeNumber减一即可。