Android Parse Pousser l'enregistrement de l'appareil de notification une seule fois sur un appareil
Chacun, je suis à l'aide de l'analyse service de notification push dans mon application. mais c'registre de tous les temps quand je l'ai ré-installer l'application dans un seul appareil.Puis le problème, c'est que,un appareil de recevoir des notifications sur chaque. J'ai fait un peu de code pour l'enregistrement, qui est illustré ci-dessous. veuillez m'aider,merci d'avance.
Parse.initialize(this, PARSE_APP_ID, PARSE_CLIENT_KEY);
ParseACL defaultACL = new ParseACL();
defaultACL.setPublicReadAccess(true);
ParseACL.setDefaultACL(defaultACL, true);
PushService.setDefaultPushCallback(this, MainActivity.class);
ParseInstallation.getCurrentInstallation().getInstallationId();
ParseInstallation.getCurrentInstallation().saveInBackground();
Et pour vous inscrire:
PushService.subscribe(this, userName, Detail.class);
Dans Le Manifeste
Ci-dessus
<permission
android:name="com.example.app.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.app.permission.C2D_MESSAGE" />
En application de la balise:
<receiver android:name="com.parse.ParseBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="act" />
</intent-filter>
</receiver>
<receiver android:name="com.app.example.PushReceiver" >
<intent-filter>
<action android:name="act" />
</action>
</intent-filter>
</receiver>
<receiver
android:name="com.parse.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<action android:name="act" />
<category android:name="com.example.app" />
</intent-filter>
</receiver>
Et chaque fois quand je fais Installer, afficher le message d'erreur qui est indiqué ci-dessous.
03-10 12:18:48.555: E/ParseCommandCache(12709): Failed to run command.
03-10 12:18:48.555: E/ParseCommandCache(12709): com.parse.ParseException: at least one ID field (installationId,deviceToken) must be specified in this operation
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.ParseCommand$3.then(ParseCommand.java:348)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$10.run(Task.java:452)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$1.execute(Task.java:68)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.completeImmediately(Task.java:448)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.continueWith(Task.java:322)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.continueWith(Task.java:333)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$8.then(Task.java:385)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$8.then(Task.java:1)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$11.run(Task.java:485)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$1.execute(Task.java:68)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.completeAfterTask(Task.java:481)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.access$9(Task.java:477)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$7.then(Task.java:350)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$7.then(Task.java:1)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.runContinuations(Task.java:514)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.access$5(Task.java:510)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$TaskCompletionSource.trySetResult(Task.java:569)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$TaskCompletionSource.setResult(Task.java:603)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$11$1.then(Task.java:497)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$11$1.then(Task.java:1)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$10.run(Task.java:452)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$1.execute(Task.java:68)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.completeImmediately(Task.java:448)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.access$8(Task.java:444)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$6.then(Task.java:315)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$6.then(Task.java:1)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.runContinuations(Task.java:514)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.access$5(Task.java:510)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$TaskCompletionSource.trySetResult(Task.java:569)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$TaskCompletionSource.setResult(Task.java:603)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$11$1.then(Task.java:497)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$11$1.then(Task.java:1)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$10.run(Task.java:452)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$1.execute(Task.java:68)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.completeImmediately(Task.java:448)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.continueWith(Task.java:322)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.continueWith(Task.java:333)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$11.run(Task.java:489)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$1.execute(Task.java:68)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.completeAfterTask(Task.java:481)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.access$9(Task.java:477)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$7.then(Task.java:350)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$7.then(Task.java:1)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.runContinuations(Task.java:514)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task.access$5(Task.java:510)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$TaskCompletionSource.trySetResult(Task.java:569)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$TaskCompletionSource.setResult(Task.java:603)
03-10 12:18:48.555: E/ParseCommandCache(12709): at com.parse.Task$3.run(Task.java:228)
03-10 12:18:48.555: E/ParseCommandCache(12709): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
03-10 12:18:48.555: E/ParseCommandCache(12709): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-10 12:18:48.555: E/ParseCommandCache(12709): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
03-10 12:18:48.555: E/ParseCommandCache(12709): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
03-10 12:18:48.555: E/ParseCommandCache(12709): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-10 12:18:48.555: E/ParseCommandCache(12709): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-10 12:18:48.555: E/ParseCommandCache(12709): at java.lang.Thread.run(Thread.java:841)
Je veux inscrire une seule fois pour de l'appareil. il ne devrait pas être un problème si app installé plusieurs fois dans l'appareil.veuillez m'aider, merci d'avance.
Dans mon cas, samsung tab 3 enregistre deux fois avec le même id unique. Est l'id unique est marqué comme colonne unique en analyser les db? Ou devrions-nous le rendre unique? si oui, comment?
source d'informationauteur Mayur Raval
Vous devez vous connecter pour publier un commentaire.
Je pense que Mukul a fourni un grand nuage de code pour cette question
ici, il est
Noter que le propriétaire est le nom de l'utilisateur ou de la clé primaire que vous pensez que u peut utiliser.
voici le lien de la même avec une meilleure explication par mukul
https://www.parse.com/questions/check-for-duplicate-installations-of-same-user-on-re-installation-of-app
Je l'ai eu après la mise à jour de la table par l'envoi de l'identifiant unique de l'appareil android.
Il va mettre à jour le raw ,mais il n'a pas ré-enregistrement de l'appareil .
PushService.subscribe
semble cache de la souscription dans le local de stockage, afin d'éviter les ré-abonnement lorsque vous lancez l'application plusieurs fois.C'est ce que le premier paramètre de cette méthode est utilisée pour :
(citation de ici).
Toutefois, lorsque vous désinstallez l'application, le stockage local pour l'application sont effacés de votre appareil, de sorte que la nouvelle installation sera la cause de
PushService.subscribe
à ré-inscrire à Google Cloud Messaging. Si le nouvel enregistrement renvoie un nouvel ID d'enregistrement, l'analyse aurait deux d'enregistrement des Identifiants qui peut être utilisé pour envoyer des notifications push à votre application, et deux d'entre eux seraient liés à la même nom d'utilisateur que vous avez fourni àsubscribe
. Par conséquent, l'envoi d'une notification à l'effet que le nom d'utilisateur de l'envoyer à l'inscription au registre de l'IDs, l'amenant à arriver deux fois.Lorsque Analyser envoyer les notifications pour vous, ils devraient se faire de Google une réponse avec
canonical_registration_id
ce qui leur permettra de connaître l'une de l'enregistrement identifiant de votre application sur votre appareil est vieux, et ne doit pas être utilisé plus. Donc (en supposant Analyser en avoir une bonne mise en œuvre de la GCM) la prochaine fois que vous envoyer une notification sur votre appareil, vous devriez recevoir qu'une seule fois.J'ai aussi été confronté à ce problème. J'ai résolu en appelant la méthode ci-dessous dans mon Activité de
onCreate()
Même si elle n'était pas complètement résoudre mon problème, mais maintenant mon application ne permet pas de se bloquer et pas plus de l'ANR pour cette raison Analyser la mise en œuvre. Si j'ai ré installer une application et l'exécuter maintenant, alors l'application crée une nouvelle installation d'enregistrer et de supprimer le dernier. Le seul problème est que le channel_name est pas inscrit sur cette course mais à la prochaine exécution de la chaîne sont abonné.
Ce qui a fonctionné pour me débarrasser de cette exception a été à l'aide de
saveEventually()
au lieu desaveInBackground()
.Ici vous avez un lien à ma réponse à une question similaire.
Je pense que
saveEventually()
est une meilleure option, car elle assure que l'installation sera toujours enregistrée, quel que soit le netwwork disponibilité. En revanche, avecsaveInBackground()
il y a une chance que la sauvegarde échoue en raison de l'absence de connectivité réseau. Aussi avecsaveEventually()
vous n'avez pas besoin de faire une vérification des erreurs, que vous devez faire dans uneSaveCallback()
avecsaveInBackground()
.Concernant la les notifications en doublecela ne devrait pas se produire si vous utilisez la dernière Analyser SDK (il ne m'arrive pas avec 1.7.1). Il y avait un bug qui a été résolu maintenant. Voir cette SORTE de question et ce bug FB.
Noter que la première fois que l'utilisateur reçoit une notification après la réinstallation de l'application, cette notification peut être livrée en deux fois. Il m'est arrivé, mais ne se produit pour la première notification. (Voir le lien FB pour plus de détails.) Après que les doublons de notification, l'ancienne installation sera supprimé automatiquement par Analyser. C'est mon expérience.
Si vous essayez d'éviter d'envoyer des notifications en double par la mise en œuvre de la logique à la CloudCode (à l'aide d'un beforeSave qui déclenche lors de l'enregistrement d'une nouvelle Installation, vérifiez si l'application a déjà été installé dans l'appareil et de la suppression de l'ancienne installation), ne le faites pas! Il n'est pas nécessaire. Analyser le fera pour vous: il va supprimer l'ancienne installation 🙂
J'ai trouvé du travail autour de laquelle va ré-enregistrer l'supprimé les installations à Analyser de nouveau.
Et lors de l'initialisation d'Analyser simplement
Créer la nouvelle classe et de l'étendre avec l'Application.
écrire le code de cette façon
}
Ajouter une entrée dans
manifest
fichier