如何在前台收到本地通知时跳过设置UIApplication.applicationIconBadgeNumber?

时间:2013-06-09 08:40:36

标签: ios uilocalnotification

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

但如果应用程序在前台,我不想设置应用程序徽章编号 为实现此目的,我在AppDelegate中尝试了以下代码:

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

首先看起来上面的代码被调用,并且只有在获得并设置了通知的徽章编号之后 因此,上面的代码没有任何效果。

当应用程序在前台收到本地通知时,如何设置徽章编号?

可以实施解决方法,例如应用程序即将进行背景时清除徽章编号,但如果有更清晰的解决方案,我很好奇。

3 个答案:

答案 0 :(得分:1)

如果您想要对前景和背景进行不同的操作,那么您需要在此前面进行内务管理。为UIApplicationDidEnterBackgroundNotificationUIApplicationWillEnterForegroundNotification通知(或激活/停用路径中的类似通知)注册监听器。但这仍然不是一个稳定的解决方案,因为它高度取决于何时调用处理程序以及何时发布通知。

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

答案 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

意味着“什么都不做”。