J'ai lu un question similaire sur SO, cependant, je n'ai pas pu obtenir la réponse correcte.
J'ai un système dans lequel nous envoyons des notifications à environ 500 appareils.
Malheureusement, beaucoup de ces appareils ne reçoivent pas la notification. J'ai constaté que les téléphones de la série OPPO F1 ne recevaient pas la notification en particulier.
J'ai observé que cela se produit si l'application est arrêtée du bac multi-tâche. Comment résoudre ça?
Mise à jour: J'ai constaté que lorsque je ferme l'application depuis la barre des tâches, mon application est forcée à s'arrêter dans le gestionnaire d'applications. Lorsque je ferme Whatsapp depuis la barre des tâches, il n’est toujours pas forcé de s’arrêter. Comment cela est-il géré par Whatsapp?
Mise à jour 03/2017 - Incluant une partie de ma réponse here .
Pour le sujet concernantswipe fermé/tué/force arrêté, ce sujet a été discuté pendant un certain temps et il ne semble pas y avoir de réponse définitive. Au cours de l’un de mes tests, je peux toujours recevoir un message (testé avec une charge data
-seulement/ message) si IBalayez la fermeturemon application. Mais lorsque jeforce a ferméil à partir du menu Paramètres, je n’a pu recevoir aucun message . Notez que ceci est not toujours le comportement.
Certains appareils ont été conçus pour que, lorsque vousbalayez l'écran prochel'application, ce sera la même chose queforcer l'arrêtleur (voir ma réponse ici ).
Il y a aussi des appareils où même si l'application est tout simplement simplementbalayée, même si ce n'est pasforce fermée, l'appareil lui-même l'empêche de recevoir des messages . D'autres disent que cela ne peut pas être le cas parce que des applications comme WhatsApp ont été capables de le faire. La raison que j’ai apprise jusqu’à présent est que les fabricants d’appareils ontliste blanchela plupart des applications bien connues pour que cela soit possible.
Cela n’est documenté nulle part car (IMO), c’est un sujet qui dépend également de l’équipement et que FCM n’a pastotal controlover.
Réponse originale:
Comme il s'agit d'un appareil spécifique (comme vous l'avez mentionné dans votre message: téléphones de la série OPPO F1), il est fort possible que lorsqu'une application estarrêtée à partir du bac multi-tâchesDans cet appareil, l'application tue l'application, ce qui entraîne également la destruction des services et des processus en arrière-plan qui lui sont associés. Voir ceci answer pour un peu plus d'idées sur ce que j'essaie de dire.
Si vous effectuez une recherche dans la communauté, il est généralement suggéré d'utiliser l'indicateur START_STICKY . Cependant, j'ai vu qu'il avait déjà été mentionné auparavant pour FirebaseMessagingService
(voir ceci post , commentaire de @ArthurThompson):
Ces services seront lancés par les services Google Play, qui sont toujours en cours d'exécution sur l'appareil. Vous n'avez pas à et ne devez pas démarrer/arrêter ces services vous-même.
Cela dit, il existe également la possibilité (encore une fois des commentaires):
Il se peut qu'un paramètre de l'appareil autorise/interdise cette opération.
Je suggère de faire des tests supplémentaires si les services sont supprimés par le périphérique lui-même ou de voir s’il existe des paramètres qui bloquent les notifications.
Avez-vous essayé d'utiliser l'attribut stopWithTask sur votre classe de service?
<service
Android:name="com.yourapp.YourPushService"
Android:stopWithTask="false" />
Si défini sur true, ce service sera automatiquement arrêté lorsque l'utilisateur supprime une tâche enracinée dans une activité appartenant à l'application. Le défaut est faux.
Si l'indicateur est false, il existe un rappel onTaskRemoved
dans votre classe de service.
Dans ce cas, vous pouvez détecter l'événement "glisser" et mettre en œuvre une solution de contournement.
J'ai vécu la même chose, mais dans mon cas, c'était les téléphones Xiaomi au lieu des téléphones Oppo. En réalité, lorsque vous fermez l'application à partir de la barre d'état système, le système la tue complètement. Cela signifie que votre application ne pourra pas recevoir de notifications via GCM/FCM. _ La permission WAKE_LOCK
n'aide pas non plus.
Cela ne signifie PAS que le téléphone ne reçoit pas la notification. Il est. Il ne veut tout simplement pas laisser les applications le montrer. Vous pouvez le vérifier en envoyant une diffusion depuis adb et en consultant votre logcat.
Une solution possible à ce problème consiste à utiliser SyncAdapter
. Bien que ce ne soit PAS conseillé, j'ai vu certaines applications l'utiliser. Une autre solution possible consiste à utiliser un type de service d’arrière-plan toujours actif. Certaines personnes utilisent également AlarmManager
car il n'est presque jamais tué. Mon point est - vous ne pouvez pas compter sur GCM/FCM pour vos notifications.
Parlons de WhatsApp maintenant -
Sur les téléphones Xiaomi, ils inscrivent sur liste blanche ou sur liste noire une application en fonction de certains critères. Si vous téléchargez une application et que celle-ci se trouve dans leur liste blanche, ils autoriseront l'application à afficher des notifications. Sinon, vous savez déjà ce qui se passe. Mais la bonne chose est que vous pouvez modifier ces paramètres. Recherchez une application nommée Sécurité. Si vous révoquez les autorisations adéquates, même WhatsApp cessera d'afficher les notifications.
Je faisais également face au même problème, mais j’ai réalisé après de nombreuses opérations de débogage que j’arrêtais les services qui reçoivent la notification Firebase
de la même manière que l’une des activités.
La réponse a été trouvée ici
Il n'y a aucun moyen d'envoyer un message de données à partir de la console de notification.
Mais il existe un autre moyen d'envoyer une notification aux périphériques et ceux-ci seront capturés à l'intérieur de onMessageReceived!
Vous devez utiliser un terminal (Mac ou Linux) ou un service tel que Postman pour envoyer une demande de publication sur ce lien: https://fcm.googleapis.com/fcm/send
avec le corps suivant:
{
"to": "/topics/your_topic_here",
"data": {
"text":"text",
"text1":"text1",
...
}
}
de plus, vous devez ajouter 2 en-têtes:
Pour obtenir votre clé de serveur, vous pouvez la trouver dans la console firebase: Votre projet -> Paramètres -> Paramètres du projet -> Messagerie dans le cloud -> Clé du serveur