推送通知到达时,应用程序徽章图标未更新

时间:2014-05-29 10:43:04

标签: ios iphone notifications push-notification badge

我在Updating application badge at midnight with options: app not launched or in background, badge number can decrease上查看了问题 和Changing application icon badge when notification arrivesPush Notification Badge Count Not UpdatingUpdate badge icon when app is closed以及更多,但我遇到的问题与应用程序处于后台且推送通知到达时相同,应用程序徽章图标未更新。

我检查了所有可能性。我的代码是:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{

    UIApplicationState appState = UIApplicationStateActive;
    if ([application respondsToSelector:@selector(applicationState)]) {
        appState = application.applicationState;
    }

    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }

    NSLog(@"remote notification: %@",[userInfo description]);

    [UIApplication sharedApplication].applicationIconBadgeNumber = [[[userInfo valueForKey:@"aps"] valueForKey:@"badge"] integerValue];

    UIApplicationState state = [application applicationState];


    if (state == UIApplicationStateActive)
    {
        NSString *message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@""
                                                            message:message
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];

    }
 }

是的,当应用程序处于前台时,它正常工作,然后它显示警告正常。但当应用程序处于后台时,既不会发生任何事件,也不会更新应用程序徽章图我还设置了背景模式,如ios7.1: push notification badge update issue所示,我还测试了应用程序徽章图标是否正确并在应用程序处于前台时打印在NSLog中。当应用程序在后台运行并且工作正常时,我需要将未读消息设置为徽章图标,但是当任何新推送通知到达时应该更新它。请建议我选择。

2 个答案:

答案 0 :(得分:11)

最后这个问题解决了。确实,当app处于后台时,没有一个动作被触发。因此,当应用处于后台时,didReceiveRemoteNotification中的appDelegate方法也不会被触发。

当任何新的推送通知到达设备时,应用程序徽章图标由iOS设置。有效载荷与@rahulPatel说的相同。我做了一点改变,因为BADGE_COUNT是从数据库中提取的,虽然它是INTEGER但是考虑到字符串和字符串不被iOS采用,这就是为什么我的应用程序的徽章图标在通知到达时不会更新。现在我的服务器端代码变成这样:

$badges=(int)$cntmsg;

$body['aps'] = array(
                'alert' => $message,
                'sound' => 'default',
                'badge' => $badges
                //'msg_id'=> $msg_id
            );

所以通过将count msg更改为(int)它解决了我的问题。感谢。

答案 1 :(得分:2)

通常在所有应用中,未读通知计数都在服务器中维护。 当服务器向特定设备发送推送通知时,令牌服务器会将徽章计数与有效负载一起发送

您的服务器逻辑需要跟踪正确的徽章计数并正确发送。

{
    "aps" :  
    {
        "alert" : "Your notification message to show",
        "badge" : BADGE_COUNT ,
        "sound" : "sound.caf"
    }
}