当应用程序处于后台或应用程序中时,使用推送通知设置应用程序图标上的徽章

时间:2015-09-15 10:40:48

标签: ios objective-c

经过几乎所有的教程后,我仍然无法正确设置我的徽章。情况就像那样 - 当我的应用程序处于后台时,我希望我的徽章增加1.所以我使用下面的代码行

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler{

if ((application.applicationState ==  UIApplicationStateBackground)) {

    NSLog(@"===========================");
    NSLog(@"App was in BACKGROUND...");

    NSLog(@"In didReceiveRemoteNotification badge number is %ld",(long)[UIApplication sharedApplication].applicationIconBadgeNumber);
    [UIApplication sharedApplication].applicationIconBadgeNumber += [[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] integerValue];
    NSLog(@"In didReceiveRemoteNotification badge number is %ld",(long)[UIApplication sharedApplication].applicationIconBadgeNumber);
    [[UIApplication sharedApplication] presentLocalNotificationNow:localNotif];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"pushNotification" object:nil userInfo:userInfo];}
if (application.applicationState ==  UIApplicationStateActive) {
    NSLog(@"===========================");
    NSLog(@"App was ACTIVE");

    NSString *str = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
    UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Notification Received" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    alertview.tag = 600;
    [alertview show];
}

NSLog(@"%@",userInfo);
handler(UIBackgroundFetchResultNewData);}

这两个NSLog分别给出了值1和2。甚至在设置applicationIconBadgeNumber之前它得到1?因此,它在收到单个通知时显示2作为徽章。

为了使我的问题更清楚,我发布完整的代码 - didReceiveRemoteNotification

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (localNotif) {
    [UIApplication sharedApplication].applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber + [[[localNotif valueForKey:@"aps"] valueForKey:@"badge"] integerValue];}

我的第二个问题是,当我的应用程序被杀死时,我会在didFinishLaunchingWithOptions中找到以下代码:

{{1}}

起初它根本没用,但在阅读了Stackoverflow的答案后,我删除了UIRemoteNotificationTypeNewsstandContentAvailability并开始显示。但仍然没有显示增量。徽章价值仍为1。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

您不需要在收到远程通知时手动设置徽章,因为iOS会使用aps中的值自动为您设置徽章 - >徽章。无论您的应用处于活动状态,非活动状态,背景状态还是不运行(已杀死),这都可以开箱即用。

但iOS不会使用该值来增加徽章,而是设置它。因此,如果推送通知中的徽章值为n,则无论应用程序的当前徽章值如何,iOS都会将其设置为n(非当前+ n)。接收通知时徽章显然增加的所有应用程序实际上管理其服务器上的徽章计数,并在通知中发送适当的递增值。

如果这就是你想要的行为,这就是你应该做的。通常,您的服务器上的每个设备都有一个badgeCount属性,每次发送推送时都会增加该属性。然后,当用户打开您的应用程序时,您向服务器发送重置调用,将此值重置为0,随后的通知将从1开始。

答案 1 :(得分:0)

徽章计数由iOS本身管理,当应用处于后台或被杀死状态时,它完全依赖于操作系统。

服务器端将处理计数并进行计算。

请看一下这个链接:

" Update badge with push notification while app in background"