web-dev-qa-db-fra.com

Comment définir la haute priorité de la notification Push qui est envoyée à NotificationHub

J'ai implémenté avec succès Azure Function, qui envoie des notifications Push à NotificationHub pour Android, iOS et UWP. Pendant les tests, j'ai découvert que lorsque Android est en mode Veille), la notification push n'est pas envoyée sur l'écran de verrouillage. Elle n'est envoyée que lorsque je déverrouille le téléphone.

J'ai découvert ce post de stackoverflow , ce qui m'a aidé à le réparer avec la méthode SendFcmNativeNotificationAsync . J'ai utilisé ce code:

string payload = @"{
                    ""data"":{
                        ""notificationtype"":""sap"",
                        ""title"":""value2"",
                    },
                        ""priority"":""high""
                    }";

await hub.SendFcmNativeNotificationAsync(payload);

Cependant, ma mise en œuvre utilise la méthode SendNotificationAsync qui fonctionne pour les 3 plates-formes, mais pas en mode Doze. Voici mon code pour envoyer une notification:

Dictionary<string, string> templateParameters = new Dictionary<string, string>();

templateParameters["alert"] = "Test";
templateParameters["title"] = "Whosap";

var notification = new TemplateNotification(templateParameters);
await hub.SendNotificationAsync(notification);

J'ai essayé de définir l'en-tête de la notification:

var headers = new Dictionary<string, string> { { "Android", @"{""priority"": ""high""}" } };
notification.Headers = headers;

Mais cela n'a pas fonctionné. Est-ce que quelqu'un sait comment définir la priorité dans l'objet TemplateNotification et l'envoyer avec la méthode SendNotificationAsync?

Voici comment je force/déforme l'appareil en mode somnolent:

adb Shell dumpsys deviceidle force-idle
adb Shell dumpsys deviceidle unforce
5
Jan Nepraš

Sur la base de votre commentaire selon lequel vous souhaitez avoir "uniquement des notifications Push informatives", vous ne pouvez malheureusement pas forcer le téléphone à afficher vos notifications à chaque fois. Cela ne constitue pas une limitation à Xamarin ou même aux fonctions Azure dans ce domaine. Même certaines des propres applications de Google se comportent de la même manière.

En regardant Liste de contrôle Doze :

Si vos utilisateurs doivent voir une notification tout de suite, assurez-vous d'utiliser un message de haute priorité FCM

Même si nous regardons tilisation de FCM pour interagir avec votre application lorsque l'appareil est inactif :

FCM est optimisé pour fonctionner avec les modes inactifs Doze et App Standby au moyen de messages FCM de haute priorité . Les messages à haute priorité FCM vous permettent de réactiver votre application de manière fiable pour accéder au réseau, même si l'appareil de l'utilisateur est en mode Doze ou si l'application est en mode App Standby. En mode Doze ou App Standby, le système délivre le message et donne à l'application un accès temporaire aux services réseau et aux wakelocks partiels, puis remet l'appareil ou l'application à l'état inactif.

Jusqu'à présent, tout ressemble à ça si vous décidez d'utiliser Messages hautement prioritaires, tout devrait bien fonctionner. Cependant, ce n'est pas toute l'histoire. Vous avez raison de définir la priorité sur élevée "priority":"high". Malheureusement, il y a quelques mises en garde à ce paramètre ( de la documentation ):

Les messages de haute priorité doivent généralement entraîner une interaction de l'utilisateur avec votre application ou ses notifications. Si FCM détecte un modèle dans lequel ils ne le font pas, vos messages peuvent être dé-priorisés .

Cela signifie que si vous n'envoyez qu'une notification informative, il ne suffira pas de réveiller l'appareil du mode Doze et d'afficher la notification. Les vérifications/restrictions sont devenues encore plus strictes à partir de Android P. En savoir plus sur les seaux de veille d'application ici .

La bonne chose est que la sortie du mode Doze se présente sous la forme de divers événements/interactions:

Dès que l'utilisateur réveille l'appareil en le déplaçant, en allumant l'écran ou en connectant un chargeur, le système quitte Doze et toutes les applications reprennent leur activité normale.

Au moins sur les téléphones que j'ai essayés, dans un scénario normal de tous les jours, les notifications sont suspendues pendant votre sommeil nocturne ou lorsque l'appareil est assis là sans aucune interaction/mouvement, etc.

Cependant, si vous avez vraiment besoin de livrer chaque notification et que c'est crucial à l'UX, alors vous avez 2 options :

  1. Si vous ne voulez pas d'interaction avec l'utilisateur, définissez la priorité sur élevé et espérez simplement que le système affichera occasionnellement certaines des notifications (probablement pendant la fenêtre de maintenance). Ce n'est pas la meilleure façon, mais par défaut, cela peut fonctionner de temps en temps.
  2. Si vous souhaitez garantir que les notifications apparaîtront, affichez un écran décrivant le problème à l'utilisateur, puis dirigez l'utilisateur vers Settings -> Apps & notifications --> Advanced --> Special app access --> Battery optimisation. Ensuite, il/elle peut sélectionner votre application et la définir manuellement sur Ne pas optimiser. Gardez à l'esprit que cela n'est pas considéré comme une meilleure pratique et: a) l'utilisateur ne doit pas connaître les conséquences de cette action et b) il est préférable de tout laisser au système d'exploitation pour qu'il fonctionne comme prévu.

Pour résumer, vous n'avez pas à définir la priorité de votre notification sur high, car le système d'exploitation verra qu'il s'agit d'une simple notification informative et il réveillera maintenant le téléphone. Gardez à l'esprit que, lorsque le téléphone passe en mode Doze "sommeil profond", il ne doit pas et ne doit pas se réveiller pour recevoir des notifications informatives, il est donc inutile d'essayer - c'est voulu par la conception. Sinon, tous les autres développeurs peuvent définir sa priorité de notification sur élevée et le téléphone risque de ne jamais passer en mode Veille, ce qui rendra la fonctionnalité inutile.

1
Mihail Duchev