我这两天都在改这么个东西:
需要根据推送消息,在下方的tabbar上显示提示红点。即:接收到推送消息,当点击推送消息时,跳转对应界面;点击程序图标进入程序时,显示提示的小红点。
前记
我记得我之前做的推送处理,分为三种情况,这个我记得很清楚,因为我第一次面试在北京的车库咖啡,被人问到了这个问题,但是我没答出来,因为那时候我确实都没做过推送处理;后来进了第一家公司,有个好的产品,然后刚好有这个需求,然后就get了这个技能。
a. 程序在后台,接收到推送消息,点击推送消息,走的是
1 |
|
b. 程序在前台,接收到推送消息,弹窗提示/直接处理,对应的方法还是
1 |
|
c. 程序被kill掉了,接收到推送消息,点击推送消息,对应的方法是
1 |
|
Now
所以当我看到这个需求时,没太在意,以为跟以前一样,能够实现。但是写着写着,发现不对的地方了。以前关注的是点击推送消息的处理,现在不光要有点击推送消息的处理,还有没点击推送消息时的处理。。。。。So,想想能不能实现,然后我想既然被kill掉能走application:didFinishLaunchingWithOptions:这个方法,带的都有推送参数,那没点击推送消息应该也没问题。
然而事实证明,我还是太天真了,我今天仔细测试了一下,发现,
application:didFinishLaunchingWithOptions: 这个方法当程序被kill掉,点击推送消息进入时,Options里有推送的信息;但是,当不点击推送消息,直接进入程序时,Options里是没有推送信息的。所以单单凭推送,这个需求是不能实现的。那怎么办?
Result
再回过头看看需求,关键问题是,当我点击程序图标进入程序时,我不知道推送的参数,没有办法判断应不应该显示小红点。
所以,再单独让后台来个请求,返回给我个应不应该显示小红点的参数;但是这样还有个问题是,什么时候请求?我最开始想的是,程序被kill 掉/在后台,点击打开的时候都应该刷新小红点,所以在applicationWillEnterForeground: 请求,但是这样的话,请求未眠也太频繁了点;而且后台说本来推送对性能要求都比较高,你再这样查询,不行!
然后,QQ上朋友发我一张这个图片:
上图中最后一句,根据通知的badge来判断是否有通知,然后发请求获取数据。在我看来,很有道理哦,这个方法不错。但是,后台还是那句话,不行,所以就你懂的砍需求了