iOS 各种状态下消息推送的处理
前言
最近在做类似微信公众号消息的功能,由于我们的即时聊天是集成了环信,环信在群推上有欠缺,于是后端的小伙伴决定用极光完成公众号消息的推送。这就尴尬了,即时聊天以及UI集成了环信,消息推送用的极光。
过程
极光推送,只是对苹果官方推送(apns)的进一步封装,实际上也是走apns。
首先说下app的状态,详情可参考 这篇文章:
Not running:
应用还没有启动,或者应用正在运行但是途中被系统停止。
** Inactive:
当前应用正在前台运行,但是并不接收事件,Inactive一般是Active与其他状态切换的过渡状态,一般很短,故做消息推送时我是忽略的。
** Active:
当前应用正在前台运行,并且接收事件。
Background:
应用处在后台,并且还在执行代码。应用进入后台后,会短暂停留在此状态,大概十分钟后会进入Suspended状态。
** Suspended**:
应用处在后台,并且已停止执行代码。
在Not running状态下收到apns,点击通知栏进入程序,会调用-(void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
这个方法,并且会把通知消息的数据放在launchOptions里;而点击应用图标进入程序虽然也调用上面方法,但并不会传递消息数据,launchOptions为空。
在** Active**状态下,收到推送会调用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
或 者 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
,消息数据在userInfo中;
在Background状态下,可参照极光这篇文档
开启Remote notifications.png开启Remote notifications,并在推送消息中附加content-available:true 的字段,收到消息时便会调用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHa
,虽然官方文档只说了在上面这个方法调用,经实测也会调用-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)user
当然iOS 7后的最好用didReceiveRemoteNotification:fetchCompletion Handler:
,毕竟是苹果官方推荐用的。
在** Suspended状态下,收到apns,系统会暂时将app切换回 Background状态,给用户大概几分钟时间处理相关数据,同样走上述Background**状态流程。
针对我们这个公众号的需求,应用处于前台和后台的情况下,都可以满足,但是在应用未打开的情况下,直接打开应用图标无法获取推送消息,点击通知栏,也只能通过launchOptions获取被点击的那个消息;而且应用长期处于后台,当系统内存吃紧时,系统会把应用杀掉。所以针对这种情况,最好在app启动时调接口检查是否有离线消息,这样就不会有消息遗漏了。
另外,还有一点要补充,远程推送消息一般有两种,分别是通知消息和自定义消息,自定义消息是只能在前台收到的,只有通知消息才能前后台都能收到。
结束
学习之路,与君共勉。