1

我安排UILocalNotification将应用程序徽章编号设置为 1。

但是如果应用程序在前台,我不想设置应用程序徽章编号。
为此,我尝试了以下代码AppDelegate

- (void)application:(UIApplication *)application didReceiveLocalNotification:
        (UILocalNotification *)notification
{
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
}

它看起来像上面调用的代码,只有在它从通知中获取并设置徽章编号之后。
结果上面的代码没有效果。

前台申请时收到本地通知时如何设置徽章编号?

可以实施解决方法,例如,当应用程序即将进入后台时清除徽章编号,但我很好奇是否有更清洁的解决方案。

4

3 回答 3

1

I think you should use this.

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

(means "do not show badge".)

[UIApplication sharedApplication].applicationIconBadgeNumber = 0

means "do nothing".

于 2014-04-09T03:40:15.590 回答
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它……但它没有用readwriteUILocalNotification

第三种解决方案似乎有效,而且似乎很清楚。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    [application cancelLocalNotification:notification];
    application.applicationIconBadgeNumber = 333;
}

(不过,我会建议application.applicationState在这样做之前检查一下)

最终解决方案是您在最后一段中评论的内容:只需将applicationIconBadgeNumberin设置applicationWillResignActive:为正确的值。据我所知,当应用程序处于前台时,看不到徽章编号。

于 2013-06-09T09:34:53.110 回答
1

如果你想对前台和后台进行不同的操作,那么你需要在这方面做家务。注册UIApplicationDidEnterBackgroundNotificationUIApplicationWillEnterForegroundNotification通知的侦听器(或沿激活/停用路径的类似侦听器)。但这仍然不是一个稳定的解决方案,因为它高度依赖于何时调用处理程序以及何时发布通知。

对于一个干净的解决方案,您应该按照您的建议在应用程序进入后台时清除徽章。这与其他应用程序的行为一致。恕我直言,将操作复杂化并不值得麻烦,以这种方式很容易引入错误。

于 2013-06-09T09:01:31.187 回答