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

我正在push notifications应用程序,但通知来临时badge count不会增加。 我在stack overflow看到了很多例子,但没有一个是有用的。

任何人都可以build议我如何解决这个问题…在此先感谢!

我的服务器端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; } 

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

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

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

编辑

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

解:

所以创build一些web服务发送deviceToken和currentBadge在该web服务中存储在服务器上,当下次发送时,请检查标记的最后一个标记值,并发送它。

你必须pipe理你的服务器端,当你发送一个通知给其他用户,然后从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]; } 

你必须从服务器端来完成。 在我的情况下,我已经通过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 

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