La notification Push fonctionne et j'ai réussi à mettre à jour le nombre d'insignes lorsque l'application est mise au premier plan.
Je suis toutefois un peu confus à ce sujet ... l'iPhone reçoit la notification et le message contextuel apparaît pour activer mon application, et le badge ne se met à jour qu'après le démarrage de l'application.
Cela ne semble pas juste en termes d'expérience utilisateur. Si j'ai bien compris, le nombre de badges devrait informer l'utilisateur de ce qui nécessite une action, par le biais d'un nombre incrémenté, mais cela ne se produira pas avant une autre étape, lorsque l'application sera en direct.
Alors, y a-t-il un moyen de dire à l'application de mettre à jour le nombre de ses badges lorsqu'elle reçoit des notifications Push et tout en étant à l'arrière-plan?
Notez que mon application n'utilise pas d'emplacement et que j'ai UIRemoteNotificationTypeBadge
dans la demande d'enregistrement de notification.
À la vôtre.
Étant donné que les notifications Push sont gérées par iOS et non par votre application, vous ne pouvez pas modifier le badge de l'application lors de la réception d'une notification Push.
Mais vous pouvez envoyer le numéro de badge dans la charge utile de la notification Push, mais vous devrez faire le calcul côté serveur.
Vous devriez lire Guide de programmation des notifications locales et push et plus particulièrement le La charge de notification .
La charge utile pourrait ressembler à ceci:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9
}
}
Maintenant, l’icône du badge de l’application affiche 9.
Nous pouvons modifier le numéro de badge lorsque nous sommes à l'arrière-plan en envoyant le paramètre "badge" dans le package de notification Push. Comme @rckoenes l'a souligné, le paramètre JSON
du badge doit être unENTIER.
Exemple de code PHP pour faire de même
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'badge' => 1,
'sound' => 'default'
);
badge => 1
où 1 est un entier et non une chaîne (c'est-à-dire sans apostrophies)
**This is the APNS payload get back from server.**
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
La valeur du badge clé est automatiquement considérée comme un nombre de badges. Du côté de l'application ios, il n'est pas nécessaire de calculer ou de gérer le décompte . Dans l'exemple ci-dessus 9, le nombre de badges.
REMARQUE Lorsque votre application est proche, vous ne pouvez pas gérer les badges vous-même.C'est pourquoi nous utilisons la clé de badge de APNS Payload Pour plus de précisions sur la notification, voir la documentation.
si vous souhaitez réduire le nombre de badges par vos propres moyens. Diminuez le nombre et mettez-le à jour vous-même.
Si vous utilisez NotificationServiceExtension, vous pouvez mettre à jour le badge dans cela.
var bestAttemptContent : UNMutableNotificationContent? //
bestAttemptContent.badge = 0//any no you wanna display
Chaque fois que votre application reçoit une notification, votre extension de service sera appelée. Enregistrez cette valeur par défaut et affichez-la. Pour partager les valeurs utilisateur par défaut entre l'application et l'extension, vous devez activer le groupe d'applications dans l'application . pour en savoir plus ici
En fait, dans iOS 10, une notification à distance appellera automatiquement la méthode didReceiveRemoteNotification
dans votre AppDelegate.
Vous avez 2 façons de mettre à jour le nombre de badges en arrière-plan.
Je l'ai fait pour mon application actuelle aussi. Vous n'avez pas besoin d'un numéro de service de notification supplémentaire.
Envoyez la clé du badge APS avec votre charge utile à APN.
Cela mettra à jour le nombre de badges en fonction de la valeur Integer de votre charge utile de badges. ex.:
// Payload for remote Notification to APN
{
"aps": {
"content-available": 1,
"alert": "Hallo, this is a Test.",
"badge": 2, // This is your Int which will appear as badge number,
"sound": default
}
}
Vous pouvez changer d'application.applicationState et mettre à jour vos badges. Nombre lorsque l'applicationState est dans .background
. MAIS vous devez prendre soin de ne pas définir le paramètre de clé de badge dans votre charge de notification lors de l'envoi à APN e.x.
// Payload to APN as silent Push notification
{
"aps": {
"content-available": 1
}
}
Voici mon code de travail pour la mise à jour du nombre de badges sans clé de badges dans la charge utile de l’APN.
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("APN recieved")
// print(userInfo)
let state = application.applicationState
switch state {
case .inactive:
print("Inactive")
case .background:
print("Background")
// update badge count here
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
case .active:
print("Active")
}
}
N'oubliez pas de réinitialiser le nombre de vos badges lorsque votre application revient à l'état actif.
func applicationDidBecomeActive(_ application: UIApplication) {
// reset badge count
application.applicationIconBadgeNumber = 0
}
Depuis iOS 10, vous pouvez développer une extension de service de notification pour votre application. Il sera lancé par le système lorsque vous recevrez une notification et vous pourrez calculer un nombre valide pour le badge et le définir.
Consultez la documentation: https://developer.Apple.com/documentation/usernotifications/unnotificationserviceextension
dans les apns, la charge doit définir "content-available": 1 pour le nombre de badges de mise à jour en arrière-plan
func application(_ application: UIApplication, didReceiveRemoteNotification
userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// increase badge count, but no need if you include content-available
application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1
}
func applicationDidBecomeActive(_ application: UIApplication) {
// reset badge count
application.applicationIconBadgeNumber = 0
}
pour par exemple.
"aps":{
"alert":"Test",
"sound":"default",
"content-available":1
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
application.applicationIconBadgeNumber = 0;
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]);
}
Comme @rckoenes l'a dit, vous devrez faire le calcul côté serveur, mais comment savoir quand incrémenter la valeur du numéro de badge à envoyer en charge utile?.
Lorsque vous lancez l’application, un message sera-t-il envoyé à votre serveur pour lui indiquer que l’application a été lancée? Ainsi, côté serveur, vous recommencez à partir de badge = 0, et bien qu'aucun message ne soit reçu par le serveur, augmentez le numéro de badge à chaque charge utile de notification Push.