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启动时调接口检查是否有离线消息,这样就不会有消息遗漏了。

另外,还有一点要补充,远程推送消息一般有两种,分别是通知消息自定义消息自定义消息是只能在前台收到的,只有通知消息才能前后台都能收到

结束

学习之路,与君共勉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 极光推送: 1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SD...
    Isspace阅读 6,774评论 10 16
  • 不同版本极光推送SDK集成各有差异,集成时一定要注意版本号,楼主已将博文更新成最新的SDK JPush v3.0....
    i顺颂时宜阅读 7,902评论 37 170
  • 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可...
    iOS开发攻城狮阅读 4,303评论 1 13
  • 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知...
    莫离_焱阅读 6,549评论 1 8
  • 推送通知注意:这里说的推送通知跟NSNotification有所区别NSNotification是抽象的,不可见的...
    醉叶惜秋阅读 1,538评论 0 3