在 ios7 中更新推送通知的徽章计数

Posted

技术标签:

【中文标题】在 ios7 中更新推送通知的徽章计数【英文标题】:Update Badge Count For Push Notifications in ios7 【发布时间】:2013-12-04 04:45:40 【问题描述】:

我正在开发push notifications 应用程序,但当通知到来时badge count 并没有增加。 我在stack overflow 看到了很多例子,但没有一个有用。

谁能建议我如何解决这个问题...提前谢谢!

我的服务器端 php 代码:

<?php

// Put your device token here (without spaces):
$deviceToken = 'c0d35d5f5ab179f0a93cb7c6b89b96b305ad3517b24e454abd4517e2323f4a7a';

// Put your private key's passphrase here:
$passphrase = '12345push';

// Put your alert message here:
$message = 'My First push notification!';
//$badge = 3;
////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default',
    'badge'=>($badge != (null) ? $badge + 1 : 1)
);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
  fclose($fp);

在 appdelegate.m 中

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


 NSString* alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"badge"];
 NSLog(@"my message-- %@",alertValue);
 int  badgeValue= [alertValue intValue];
 [UIApplication sharedApplication].applicationIconBadgeNumber += badgeValue;
 

【问题讨论】:

在徽章键中使用整数值而不是字符串 【参考方案1】:

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

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


    "aps" :  
    
        "alert" : "Your notification message",
        "badge" : badgecount ,
        "sound" : "bingbong.aiff"
    

编辑

您已在didReceiveRemoteNotification 方法中设置徽章计数。在这个名为appbadge的方法是从pushnotification设置之前,所以从服务器你必须设置正确的徽章..

解决方案:

因此,在该网络服务中创建一些网络服务发送 deviceToken 和 currentBadge 以存储在服务器上,并在下次发送推送时检查令牌的最后一个徽章值,然后发送它。

【讨论】:

感谢您的回复!我尝试了相同的代码,但它不起作用。 @shalini: 添加你的userInfo的日志。 @shalini:检查更新的答案。【参考方案2】:

当您向其他用户发送通知时,您必须管理您的服务器端,然后从 php 端他们设置一个计数器来增加徽章并在您打开应用程序时将通知发送给其他用户,徽章设置为 null像这样:

- (void) applicationWillResignActive:(UIApplication *) application

    application.applicationIconBadgeNumber = 0;

& 接收您设置此代码的通知:

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    
    NSLog(@"userInfo %@",userInfo);

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

    [application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]];

    NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]);

    NSString *message = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Test" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [alert show];

【讨论】:

在我的应用程序中出现了同样的问题,收到了通知,但是当应用程序在后台时徽章编号没有更新。【参考方案3】:

您必须从服务器端执行此操作。就我而言,我是通过 php 和 mysql 完成的。这是我的数据库

我添加了一个字段 badgecount,并且每次使用此代码向设备发送推送时都会增加徽章计数

    $query = "SELECT badgecount FROM pushnotifications WHERE device_token = '$device_token'";
    $query = $this->db->query($query);
    $row = $query->row_array();
    $updatequery = "update pushnotifications set badgecount=badgecount+1 WHERE device_token ='$device_token'";
    $updatequery = $this->db->query($updatequery);
    $device = $device_token;
    $payload['aps'] = array('alert' => $pushmessage, 'badge' =>$row["badgecount"]+1, 'sound' => 'default');
    $payload = json_encode($payload); 

我还制作了另一个 api 来制作在

中调用的 badgcount 0
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

因此,当看到通知时,它在服务器中再次为零。

【讨论】:

iPhone离线时看到通知怎么办?你是怎么做的?您无法清除服务器中的计数...

以上是关于在 ios7 中更新推送通知的徽章计数的主要内容,如果未能解决你的问题,请参考以下文章

更新推送通知徽章计数

iOS6 中的自动增量推送通知徽章

如何在 iOS 中清除推送通知徽章计数?

Firebase 推送通知徽章计数是不是在 iOS 中自动增加?

ios:此有效负载格式中的推送通知徽章计数未增加

如何在 iOS 10 中为推送通知设置徽章计数?