角标显示异常
接手别人项目发现桌面角标点击可以清零,但是再收到一条远程推送,不是显示1,而是在之前的基数上+1
查看极光API发现:
///----------------------------------------------------
/// @name Server badge 服务器端 badge 功能
///----------------------------------------------------
/*!
* @abstract 设置角标(到服务器)
*
* @param value 新的值. 会覆盖服务器上保存的值(这个用户)
*
* @discussion 本接口不会改变应用本地的角标值.
* 本地仍须调用 UIApplication:setApplicationIconBadgeNumber 函数来设置脚标.
*
* 本接口用于配合 JPush 提供的服务器端角标功能.
* 该功能解决的问题是, 服务器端推送 APNs 时, 并不知道客户端原来已经存在的角标是多少, 指定一个固定的数字不太合理.
*
* JPush 服务器端脚标功能提供:
*
* - 通过本 API 把当前客户端(当前这个用户的) 的实际 badge 设置到服务器端保存起来;
* - 调用服务器端 API 发 APNs 时(通常这个调用是批量针对大量用户),
* 使用 "+1" 的语义, 来表达需要基于目标用户实际的 badge 值(保存的) +1 来下发通知时带上新的 badge 值;
*/
+ (BOOL)setBadge:(NSInteger)value;
/*!
* @abstract 重置脚标(为0)
*
* @discussion 相当于 [setBadge:0] 的效果.
* 参考 [JPUSHService setBadge:] 说明来理解其作用.
*/
+ (void)resetBadge;
原来极光服务器也保存有一份角标值,清零本地角标后,同步一下极光服务器的值就好了。
通知栏推送消息保留
使用时发现,有的应用角标清零后,下拉通知栏的推送消息还在,而我的
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
清零后,通知栏的消息也被清空了,需要保存怎么办。
只需 [UIApplication sharedApplication].applicationIconBadgeNumber = -1;
据说这是利用了系统的一个bug,当角标设置值小于0时,认为非法,Icon的角标会被隐藏,同事通知栏不会做任何处理,通知消息也就不会被清除
综上所述,只需两行就能解决问题
- (void)applicationDidBecomeActive:(UIApplication *)application {
[UIApplication sharedApplication].applicationIconBadgeNumber = -1;//999999
[JPUSHService resetBadge];
}