我已安排UILocalNotification
将应用程序徽章编号设置为1。
但如果应用程序在前台,我不想设置应用程序徽章编号
为实现此目的,我在AppDelegate
中尝试了以下代码:
- (void)application:(UIApplication *)application didReceiveLocalNotification:
(UILocalNotification *)notification
{
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
}
首先看起来上面的代码被调用,并且只有在获得并设置了通知的徽章编号之后 因此,上面的代码没有任何效果。
当应用程序在前台收到本地通知时,如何不设置徽章编号?
可以实施解决方法,例如应用程序即将进行背景时清除徽章编号,但如果有更清晰的解决方案,我很好奇。
答案 0 :(得分:1)
如果您想要对前景和背景进行不同的操作,那么您需要在此前面进行内务管理。为UIApplicationDidEnterBackgroundNotification
和UIApplicationWillEnterForegroundNotification
通知(或激活/停用路径中的类似通知)注册监听器。但这仍然不是一个稳定的解决方案,因为它高度取决于何时调用处理程序以及何时发布通知。
对于干净的解决方案,当应用程序按照您的建议进入后台时,您应该清除徽章。这与其他应用程序的行为相对应。恕我直言,操作复杂化并不值得麻烦,以这种方式引入错误非常容易。
答案 1 :(得分:1)
在我看来applicationIconBadgeNumber
被设置为“同时”,因为正在调用委托方法,而不是之前或之后,因为在委托方法中设置断点似乎将徽章更新为你假装的数字。
所以,第一个(丑陋的)解决方案:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 125*NSEC_PER_MSEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
application.applicationIconBadgeNumber = 333;
});
}
(125ms似乎可以解决问题)。
第二种解决方案我虽然没有成功。由于applicationIconBadgeNumber
readwrite
UILocalNotification
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
[application cancelLocalNotification:notification];
application.applicationIconBadgeNumber = 333;
}
,我试图动态修改...但它不起作用。
第三种解决方案似乎有效,而且似乎足够清楚。
application.applicationState
(我建议在执行此操作之前检查applicationIconBadgeNumber
)
最终解决方案是您在上一段中的评论:只需将applicationWillResignActive:
中的{{1}}设置为正确的值即可。据我所见,当应用程序处于前台时,无法看到徽章编号。
答案 2 :(得分:1)
我认为你应该使用它。
[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
(表示“不显示徽章”。)
[UIApplication sharedApplication].applicationIconBadgeNumber = 0
意味着“什么都不做”。