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
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.