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

6
我查看了以下问题:在午夜更新应用程序徽章,选项:应用程序未启动或在后台,徽章数字可能会减少当通知到达时更改应用程序图标徽章推送通知徽章计数不更新应用程序关闭时更新徽章图标 和其他许多问题,但我的问题是当应用程序在后台运行并收到推送通知时,应用程序徽章图标没有更新。
我已经检查了所有可能性。我的代码是:
-(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];

    }
 }

当应用程序在前台运行时,它能够正常显示提示信息。但是当应用程序在后台运行时,无论何时都不会发生任何事件,也不会更新应用程序的徽章图标。我已经按照iOS 7.1:推送通知徽章更新问题所示设置了后台模式,并且测试表明应用程序徽章图标在前台运行时能够正确接收并在NSLog中打印。我需要将未读消息设置为应用程序的徽章图标,在应用程序进入后台运行后也能正常工作,但是当新的推送通知到来时,它应该被更新。请给我建议。


2
必须从服务器端进行管理,而不是从iOS端。 - iPatel
@iPatel 是的,但为什么当设置aps->badge时徽章图标没有更新?当通知到达并且应用程序无法处理通知因为它在后台运行时,徽章图标应该设置为aps->badge的值。 - Michael
服务器端代码没有问题,我已经测试过了。当应用程序处于前台时,它可以完美地计算徽章计数结果,我已经通过调试进行了检查。但当通知到达并且应用程序在后台运行时,它应该更新应用程序图标徽章。 - Max
2个回答

12

最终这个问题已经解决了。确实在应用程序后台时没有任何操作会触发,所以即使应用程序处于后台,appDelegate 中的 didReceiveRemoteNotification 方法也不会被触发。

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),解决了我的问题。谢谢。


徽章计数器以字符串格式存在。从服务器获取整数解决了我的问题。 - Mehul Solanki

3
通常在所有应用程序中,未读通知计数都是在服务器上维护的。当服务器向特定设备令牌发送推送通知时,服务器会将徽章计数与有效负载一起发送。您的服务器逻辑需要跟踪正确的徽章计数并适当地发送它。
{
    "aps" :  
    {
        "alert" : "Your notification message to show",
        "badge" : BADGE_COUNT ,
        "sound" : "sound.caf"
    }
}

是的,从服务器端来看,您在代码中展示的是正确的。它每次都会发送更新后的徽章计数。 - Max
我收到了推送通知,内容如下:远程通知: { aps = { alert = " 点击查看消息。"; badge = 34; sound = default; }; } - Max
你有尝试在不同的iOS设备上进行检查吗? - Rahul Patel
是的,Rahul,问题已经解决了...由于从数据库中获取的BADGE_count值变成了字符串,这就是问题所在。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接