Mettre à jour le nombre de badges pour les notifications push dans ios7

Je travaille sur l'application de push notifications mais le badge count n'augmente pas quand la notification arrive. J'ai vu tant d'exemples dans le stack overflow mais personne n'est utile.

Quelqu'un peut-il me suggérer comment résoudre ce problème … merci d'avance!

Mon code PHP côté server:

 <?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); 

dans appdelegate.m

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSSsortingng* alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"badge"]; NSLog(@"my message-- %@",alertValue); int badgeValue= [alertValue intValue]; [UIApplication sharedApplication].applicationIconBadgeNumber += badgeValue; } 

Généralement dans toutes les applications, les counts de notification non lus sont conservés sur le server. Lorsque le server envoie une notification push à un server de jeton de périphérique particulier, il envoie le count de badge avec la charge utile .

Votre logique de server doit garder une trace du nombre de badges approprié et l'envoyer de manière appropriée.

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

MODIFIER

Vous avez défini le nombre de badges dans la méthode didReceiveRemoteNotification . avant que cette méthode appelée appbadge soit définie à partir de pushnotification, donc à partir du server, vous devez définir le bon badge ..

Solution:

créez donc un service web envoyez deviceToken et currentBadge dans ce webservice pour les stocker sur le server, et lorsque la prochaine fois que vous envoyez push, vérifiez la dernière valeur de badge pour le token et envoyez-le.

Vous devez gérer votre côté server lorsque vous envoyez une notification à un autre user puis à partir du côté php ils définissent un countur pour incrémenter le badge et envoyer la notification à un autre user après que lorsque vous ouvrez votre application, le badge est défini comme ceci:

 - (void) applicationWillResignActive:(UIApplication *) application { application.applicationIconBadgeNumber = 0; } 

& pour recevoir la notification, vous définissez ce code:

 - (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]); NSSsortingng *message = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Test" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } 

Vous devez le faire du côté du server. Dans mon cas, je l'ai fait via php et mysql. Voici ma database entrez la description de l'image ici

J'ai ajouté un champ badgecount et j'augmente le nombre de badges à chaque fois que j'envoie le push à l'appareil avec ce code

  $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); 

Et je fais aussi une autre api pour faire le badgcount 0 qui est appelé dans le

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

Ainsi, lorsque la notification est vue, elle est de nouveau nulle dans le server.