PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Comment lire le contenu d'une notification SANS avoir cliqué dessus préalablement ?
Comment lire le contenu d'une notification SANS avoir cliqué dessus préalablement ?
Débuté par Eric67, 11 juil. 2016 07:15 - 15 réponses
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 11 juillet 2016 - 07:15
Bonjour,

Je souhaite récupérer les valeurs d'une notification push (sur android ) par programmation sans ou AVANT même que l'utilisateur n'ait cliqué sur la notification.

Quelqu'un saurait-il comment réaliser cela ?

Pour expliquer un peu le pourquoi, j'ai une application avec une fonction de messagerie genre WhatsApp, qui fonctionne en C/S. Un fichier contient les messages échangés entres les utilisateurs.

A des fins d'optimisation, j'ai imaginé un mécanisme où c'est la procédure déclenchée par l'arrivée de la notification qui se charge d'enregistrer les données dans un fichier "local".

Toutefois, lorsque l'application n'est pas lancée, cette procédure ne se déclenche pas. Donc, la notification est de type "non supprimable" de sorte que l'utilisateur soit obligé de cliquer sur la notification. Ainsi, l'application se lance, le message est alors enregistré, la notification supprimée et le tour est joué.

Tout va bien jusque là, sauf que si l'utilisateur a reçu entre temps plusieurs notifications, il faudrait que toutes les notifications (leurs contenus) puissent être traitées sans que l'utilisateur n'ait besoin de cliquer dessus... (vous l'avez compris, sauf la toute première, celle qui va déclencher la procédure si l'application n'était pas lancée).

D'où l'intérêt de pouvoir "lire" une notification sans que l'utilisateur ait cliqué dessus.

Si quelqu'un à une idée...

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Message modifié, 11 juillet 2016 - 07:19
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 11 juillet 2016 - 08:00
Bonjour Eric,

As-tu étudié ceci : http://doc.pcsoft.fr/fr-FR/?1000021015

"Si l’application est fermée, le système affiche la notification dans la barre de notification. L’utilisateur peut alors choisir de valider la notification. S’il le fait, l’application est lancée.
Android Si aucun message n’est spécifié dans la notification, l’application s’ouvre directement et la notification n’est pas affichée.
Une fois l’application lancée, il y a deux cas de figures :
Si la fonction NotifPushProcédure a été appelée dans le code d'initialisation du projet, la procédure globale passée en paramètre à cette fonction est appelée et la première fenêtre de l’application n’est pas ouverte.
Remarque : La fonction OuvreFenêtreMobile doit être appelée dans la procédure.
Si la fonction NotifPushProcédure n’a pas été appelée, la première fenêtre de l’application est ouverte."

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 11 juillet 2016 - 08:36
Bonjour François,

Merci pour ta réponse.

Oui j'ai étudié attentivement cette page. J'ai l'espoir que quelque chose m'échappe encore et que cela soit réalisable.

Le contexte point par point, pour mieux comprendre je reformule le soucis :

- L'application n'est pas lancée
- Une notification est "non supprimable". En l'occurrence, l'utilisateur devra obligatoirement cliquer dessus à un moment ou un autre
- Plusieurs notifications arrivent (l'application n'étant toujours pas lancée la procédure associée ne se lance pas)
- L'utilisateur clique sur une notification
- L'application se lance, la procédure associée s'exécute
- Cette procédure récupère les données utiles stockées dans la notification courante et les enregistre dans un fichier local
- La notification courante est supprimée par programmation

Tout cela fonctionne sans soucis.

Maintenant quid des autres notifications ? Le problème est qu'un expéditeur a pu adresser plusieurs messages au même destinataire ; Plusieurs notifications sont donc arrivées.
Comment les lire - SANS que l'utilisateur ne clique dessus - pour en récupérer les données et les enregistrer dans la base locale ? (il aura juste cliqué sur la première arrivée par exemple).

Ou dit autrement, comment lire itérativement la pile de notifications potentiellement arrivées ?

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Message modifié, 11 juillet 2016 - 08:39
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 12 juillet 2016 - 08:00
Bonjour Eric,

Si l'envoi d'une notification pour chaque message reçu n'est pas indispensable, il est à mon avis possible d'envoyer une notification pour le premier message reçu. Lorsque cette notification est exploitée, il suffit de lire les autres messages reçus entre temps et non encore lus et de les transférer sur le mobile. Une procédure de validation des messages reçus sur le mobile est alors aussi possible.

Au prochaine message reçu > notification
Il n'y aura alors toujours qu'une seule notification en cours ouverte ou non, traitée ou non.

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 13 juillet 2016 - 07:43
Bonjour François,

Si j'ai bien compris ton astuce, il ne faudrait pas afficher les notifications (sauf la première) arrivant d'un même expéditeur vers un même destinataire ?
L'idée est bonne mais malheureusement il y a un hic. En effet, si l'application n'est pas lancée, il n'y a aucun moyen d'exploiter le contenu des push qui arrivent !

Pour mieux comprendre, le contexte point par point :

- L'application n'est pas lancée
- Les notifications sont "non supprimables". C-à-d que l'utilisateur devra obligatoirement cliquer dessus à un moment ou un autre
- Plusieurs notifications arrivent (l'application n'est toujours pas lancée à ce stade, donc la procédure associée ne se lance pas)
- Maintenant, l'utilisateur clique sur une notification
- L'application se lance et la procédure associée s'exécute
- Cette procédure traite la notification courante
- enfin, la notification courante est supprimée par programmation

Tout cela fonctionne sans soucis...

Maintenant quid des autres notifications en attente dans la pile ? Celles arrivées avant le lancement de l'application ?

En l'occurrence, comment les exploiter directement SANS que l'utilisateur ne clique dessus ?
Ou encore, autrement dit, comment lire itérativement la pile de notifications potentiellement arrivées ?

Bref... entre temps j'ai contacté le support et il semble que cela ne soit pas possible, aucune fonction pour cela :(
Ils me conseillent d'utiliser les thread persistants. Cela me semble être une bonne idée que je vais creuser.

Quel dommage quand même, peut-être que traiter les notifications empilées via java serait possible mais je ne suis pas expert matière de java, sic!

En tous les cas merci pour ton aide !

Bien cordialement,
Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 13 juillet 2016 - 08:05
Bonjour Eric,

Lire la pile des notifications me semble très difficile.

Par contre d'après la doc que j'ai citée plus haut, il semble possible de lancer l'appli sans afficher de fenêtre donc bien avec un fonctionnement en arrière-plan. Tu peux aussi envisager dans ce cas une double notification pour chaque message : une "visible" à valider et une qui fonctionnerait en arrière-plan ?

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 13 juillet 2016 - 09:08
Bonjour François,

J'avais testé cette possibilité et la notification "transparente", notif sans contenu, ne semblait pas s'activer si l'application n'est pas active.
Auquel cas, il y aurait un bogue car en effet la doc le stipule bien.
Ceci dit, je vais revoir cette possibilité, le bogue était peut-être de mon côté.
Je te tiendrai informé.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 13 juillet 2016 - 14:18
C'est bien ce que je pensais. Il y a un bogue au niveau de WM je pense.

La notification "transparente" arrive bien. Si l'application est lancée, alors la procédure est bien exécutée en toute transparence.
MAIS si l'application n'est pas lancée, rien ne se passe !

Voici ce que le doc dit :

Si l’application est fermée :
Si aucun message n’est spécifié dans la notification, l’application s’ouvre directement et la notification n’est pas affichée.
NON, l'application ne s'ouvre pas, elle passe par contre en premier plan si elle est déjà en fond.

Une fois l’application lancée, il y a deux cas de figures :
Si la fonction NotifPushProcédure a été appelée dans le code d'initialisation du projet (c'est le cas) la procédure globale passée en paramètre à cette fonction est appelée et la première fenêtre de l’application n’est pas ouverte. (La 1er fenêtre n'est effectivement pas ouverte MAIS la procédure globale n'est PAS appelée (c'est là où est le bogue). Evidemment, ma procédure est bien globale.
Remarque : La fonction OuvreFenêtreMobile doit être appelée dans la procédure. --> C'est le cas.

Si l’application est déjà lancée : tout fonctionne telle que la doc le dit.


Bref... Parfois on cherche à faire compliqué quand tout est simple. Finalement, je passe l'ensemble des données à enregistrer DANS l'appel du WS qui est en charge d'envoyer le notification. Puis, tout simplement, c'est le Web Service qui, outre l'envoi du Push, traite aussi l'enregistrement des données. Enfin, je réplique en local dans un thread. Le tour est joué !

Merci encore pour ton implication François.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 19 novembre 2016 - 16:06
Bonjour Eric,

Même constatation sur Android : si l'application n'a pas été lancée (elle est fermée), impossible de lancer quoi que ce soit par une notification Push.

J'ai essayé toutes les combinaisons possibles entre des chaines vides ou pas pour le message, contenu et titre : rien à faire.

Par contre si elle fonctionne en tâche de fond : la notification s'affiche de suite.
PS : le paramètre sur le serveur est maNotification.ActiveApplication = vrai

Bizarre et non conforme à la doc...

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 20 novembre 2016 - 08:49
Bonjour François,

Des mois ont passés et toujours pas de solution via les push transparents. Toujours pour la même raison, en l'occurrence pas moyen de lancer une procédure automatiquement à la réception du push si l'application n'est pas lancée... Ok.

Maintenant, il me vient à l'instant juste un début d'idée. Peut-être une piste à creuser...

Supposons que l'application possède un widget. Celui-ci n'est-il pas supposé pouvoir être activé même si l'application principale n'est pas active ? (y compris pas en arrière plan).
Considérant par ailleurs qu'il tourne dans un processus différent de l'application peut-être que cela fonctionnerait ? Vois-tu l'idée ?

Sinon, il faut effectivement passer par un thread persistant mais là, adieu iOS si l'application est dédiée aux deux OS.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Message modifié, 20 novembre 2016 - 08:51
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 22 novembre 2016 - 08:36
Bonjour Eric,

J'ai adressé une requête au ST sur ce point.

j'ai oublié de préciser que si l'appli est fermée, il est impossible de la lancer même avec un message "vide" mais qu'aussi la notification ne s'affiche pas.

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 06 janvier 2017 - 10:23
Bonjour,

Le ST vient de me répondre qu'ils n'arrivent pas à reproduire les cas décrits.

Je n'ai pas le temps de leur envoyer un projet en double (une appli mobile pour Android + une qui envoie les notifications push soit en Windev ou Webdev)

Si cela intéresse quelqu'un, c'est la référence 100 758/113140.

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 07 janvier 2017 - 11:25
Bonjour François,

Merci pour ce retour.

Une telle réponse de la part de pcsoft sous entendrait que cela fonctionne.... Ce qui serait plutôt une bonne nouvelle !

Je vais me pencher à nouveau sur ce soucis et réactualiserai ce post en fonction de mes avancés.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 07 janvier 2017 - 17:44
Bonsoir François,

Bon, ça marche nickel chrome...

Testé en WM21. Je testerai en 22 dès que possible car pour l'heure il n'est pas encore possible de déployer un webservice en 22.
Sera déployé en janvier selon pcsoft.

Ce qu'il faut faire :

Les 2 fonctions d'initialisation doivent impérativement être dans le code d'initialisation du projet.

NotifPushActive(EnregistreNotifPush)
NotifPushProcedure(RéceptionNotifPush)


Concernant NotifPushActive rien à dire de particulier. Tu mémorises les tokens des utilisateurs par exemple.

Concernant la Callback, tu crées une procédure du genre :

Procedure RéceptionNotifPush(maNotif est un Notification)

// Notification pour test réception en mode transparent
SI maNotif.Contenu = "transparent" ALORS

// Ton code ici....
// Pour ma part j'ai testé l'écriture dans un fichier, l'ouverture d'une fenêtre quelconque du projet...
// Tout fonctionne parfaitement

// et bien supprimer la notif en sortant même si elle n'est jamais affichée
NotifSupprime(maNotif)
RETOUR
FIN



Concernant le web service :

MaNotification est une Notification
MaNotification..Titre = "" // TITRE ET MESSAGE DOIT ETRE IMPERATIVEMENT VIDES
MaNotification..Message = ""
// le contenu de cette propriété n'est pas affiché mais est accessible par la procédure de réception de la notification
// On l'utilise comme Flag pour déterminer l'action à lancer à la réception de la notification dans l'app. mobile
MaNotification..Contenu = "transparent" // Le périphérique devra traiter un push transparent
MaNotification..Son = notifSonDéfaut
MaNotification..Vibration = Vrai
MaNotification..ActiveApplication = Vrai
MaNotification..Supprimable = Non
// Envoyer la notification
MonRésultat = NotifPushEnvoie(MaNotification, tabIdentifiantsAEnvoyer, "Ton code API ici", tabTokensInvalides)


Voila. La seule chose que j'ai changé dans mon code par rapport à celui d'origine, c'est le titre de la notif qui semble devoir être vide aussi.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
1 603 messages
Popularité : +64 (70 votes)
Posté le 09 janvier 2017 - 16:45
Bonjour Eric,

J'ai aussi examiné tout cela.

L'appli peut effectivement être lancée avec un titre et un message vide par une notification PUSH depuis Windev non mobile ou Webdev

j'avais de mémoire cliqué dans les paramètres d'Android > applications > sur "forcer l'arrêt"

Dans ce cas, l'application à mon avis ne pourra jamais être ouverte par une notification PUSH !
C'est ce que j'avais testé pour poster mes messages dans le forum.

Si elle a été ouverte puis fermée par un finprogramme() par exemple, pas de problème, elle peut être lancée...

Par contre j'ai suivi tes conseils en rajoutant "NotifSupprime(maNotif)"

Difficile de reproduire fidèlement ce qui a été fait !

PM : NotifPushActive(EnregistreNotifPush) n'est pas nécessaire dans le code d'ini du projet car je le lance par un bouton.

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 10 janvier 2017 - 09:54
Bonjour François,

Je confirme qu'une application peut être lancée depuis un push transparent. Je le fais maintenant sans soucis. C'était un point très important pour moi car l'une de mes applications en développement reposera sur cette possibilité. Il s'agit bien d'une application mobile.

Je confirme aussi que NotifPushActive doit obligatoirement être placé dans l'init du projet. Si tu places cette fonction dans l'init de la 1er fenêtre par exemple, alors ça ne fonctionne plus. Ce principe peut poser quelques difficultés d'ailleurs, lorsqu'il s'agit d'enregistrer un token...

Attention au finprogramme(), cette fonction est normalement interdite. D'ailleurs, je n'en vois pas vraiment l'intérêt. Il est préférable de fonctionner à la mode "apple" et ne pas l'intégrer.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr