Mon application utilise la C2DM (notification push) de Google pour informer les utilisateurs de la nouvelle activité de leurs amis. Une fois qu'ils ont installé l'application, j'enregistre l'appareil auprès des serveurs C2DM et stocke le numéro de téléphone de l'utilisateur. Je sais donc que l'utilisateur utilise mon application et je peux lui envoyer les notifications Push. Mais que se passe-t-il si les utilisateurs désinstallent mon application, existe-t-il un moyen de l'attraper dans mon application? Ou la seule façon est d'attraper une erreur sur mon serveur lorsque j'envoie un C2DM et qu'il est inaccessible, puis de marquer un utilisateur comme inactif?
J'aimerais informer les utilisateurs lorsque leurs amis utilisent une application et lorsqu'ils ne le font plus.
Quelle est la meilleure solution pour ce scénario?
Malheureusement, l'intention ACTION_PACKAGE_REMOVED sera envoyée à tous les récepteurs à l'exception du vôtre. Ceci est confirmé ici .
Quelques questions pour votre plan C2DM, car je ne le connais pas très bien. Si l'utilisateur laisse son appareil éteint pendant une longue période, cela déclenchera-t-il la condition d'erreur que vous utilisez? Comment le C2DM signale-t-il réellement un périphérique "inaccessible"? Est-ce une condition qui se produit uniquement lorsqu'il tente d'envoyer la notification Push et échoue ou est-ce quand il détermine en quelque sorte qu'il atteint le périphérique mais ne parvient pas à être traité correctement? Évidemment, dans le deuxième scénario, votre plan fonctionnerait, mais je peux voir des "faux positifs" se produire autrement.
Ancienne SO question pour référence: Android ne reçoit pas l'intention ACTION_PACKAGE_REMOVED dans le package supprimé
La documentation GCM explique cette situation ici:
"Une application peut être automatiquement désinscrite après avoir été désinstallée de l'appareil. Cependant, ce processus ne se produit pas immédiatement, car Android ne fournit pas de rappel de désinstallation."
Fondamentalement, lorsque GCM essaie d'envoyer la prochaine notification Push, l'appareil indique à GCM que l'application réceptrice a été désinstallée.
En ce qui concerne la notification à des amis que leurs amis n'utilisent plus l'application, GCM enverra une erreur NotRegistered
à votre serveur de notification lorsque cet échec se produit; ce ne sera pas immédiat, mais pourriez-vous l'utiliser?
Oui, mais c'est assez hacky. La méthode est basée sur le fait que la première chose Android fait lors de la désinstallation de votre application est la suppression de votre fichier de données. Vous pouvez donc utiliser un observateur de fichiers pour détecter la suppression. Vous devez également écrire ceci en code natif. Si vous écrivez votre code en Java, votre application sera désinstallée avant de pouvoir exécuter n'importe quel code. Veuillez consulter cette démo: https://github.com/sevenler/Uninstall_Statics
Le service Google C2DM fonctionne en mode passif lorsqu'il s'agit de détecter les applications désinstallées.
La première notification Push après la désinstallation de votre application (sans vous désinscrire de C2DM !!!) ne retournera aucune erreur en réponse. Cependant, la deuxième notification Push renverra un code d'erreur "enregistrement non valide" ou "non enregistré" où vous pourrez vous rendre compte que l'application a été désinstallée.
La raison en est que les serveurs C2DM renvoient immédiatement le code de réponse et essaient seulement ensuite de pousser le client. Lorsque le client répond qu'une application a été désinstallée, elle est supprimée des serveurs C2DM. La prochaine tentative de push renverra immédiatement un code d'erreur.
Je ne connais qu'une seule façon avec la réponse du serveur 200 avec le message "NotRegistered" dans le corps.
NotRegistered - Le registration_id n'est plus valide, par exemple l'utilisateur a désinstallé l'application ou désactivé les notifications. L'expéditeur doit cesser d'envoyer des messages à cet appareil.
J'ai quelques points à vous dire,
Lorsque vous envoyez des messages à GCM à partir de votre serveur, vous obtiendrez une chaîne de réponse. Si vous obtenez une erreur comme "Non enregistré, vous devez supprimer l'ID d'enregistrement de la base de données de votre serveur car l'application a été désinstallée de l'appareil ou elle n'a pas de récepteur de diffusion configuré pour recevoir les intentions com.google.Android.c2dm.intent.RECEIVE. "
Regardez dans ce document GCM: GCM Unregistration
Vous ne devez jamais désinscrire votre application. Ceci est pris en charge du côté serveur.