2014-06-24 2 views
2

Lorsque j'émet une notification push, 5 des mêmes notifications apparaissent sur l'appareil. Une raison pour laquelle? Voici mon application.java et manifeste:Obtention de plusieurs notifications par push

application public class {étend android.app.Application

public Application() { 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE); 

    // Initialize the Parse SDK. 
    Parse.initialize(this, "__REMOVED KEY FOR SECURITY___", "__REMOVED KEY FOR SECURITY___"); 


    // Specify an Activity to handle all pushes by default. 

    PushService.setDefaultPushCallback(this, SplashActivity.class); 
    ParseInstallation.getCurrentInstallation().saveInBackground(); 
} 

Et mon manifeste:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.bordengrammar.bordengrammarapp" 
    android:versionCode="1" 
    android:versionName="1" > 

    <!-- OpenGL For Map --> 

    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <!-- Permmisions --> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 

    <!-- Maps --> 

    <permission 
     android:name="com.bordengrammar.bordengrammarapp.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.bordengrammar.bordengrammarapp.permission.MAPS_RECEIVE" /> 

    <!-- Push notifcation --> 

    <permission 
     android:name="com.bordengrammar.bordengrammarapp.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.bordengrammar.bordengrammarapp.permission.C2D_MESSAGE" /> 

    <!-- Android 3.0+ --> 

    <uses-sdk 
     android:minSdkVersion="11" 
     android:targetSdkVersion="17" /> 

    <!-- Main settings for application --> 

    <application 
     android:name=".Application" 
     android:allowBackup="true" 
     android:description="@string/des" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.Example" > 

     <!-- Splash screen --> 
     <activity 
      android:name=".SplashActivity" 
      android:label="@string/app_name" 
      android:theme="@style/FullBleedTheme" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <!-- Main Activity --> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
     </activity> 

     <!-- Push Stuff --> 

     <receiver 
      android:name=".BGSWidgetProvider" 
      android:icon="@drawable/ic_launcher" 
      android:label="BGS Widget" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.ALTERNATIVE" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="com.bordengrammar.bordengrammarapp.BGSWidgetService.MOODY" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_info" /> 
     </receiver> 


     <!-- Other activitys --> 

     <activity 
      android:name=".AboutActivity" 
      android:label="@string/title_activity_about" > 
     </activity> 
     <activity 
      android:name=".SettingsActivity" 
      android:label="@string/title_activity_settings" > 
     </activity> 
     <activity android:name=".LinkActivity" 
        android:label="View Link" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="MainActivity" /> 
     </activity> 

     <!-- Meta-data (keys etc) --> 

     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 
     <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="AIzaSyB7Vi7qBh0Ui0jC5A_cJkeCG2-jB6mQJ0w" /> 

     <activity 
      android:name=".TwitterActivity" 
      android:label="@string/title_activity_twitter" 
      android:parentActivityName=".MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="MainActivity" /> 
     </activity> 
     <activity 
      android:name=".PrivacyActivity" 
      android:label="@string/title_activity_privacy" 
      android:parentActivityName=".MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="MainActivity" /> 
     </activity> 

     <meta-data 
      android:name="com.crashlytics.ApiKey" 
      android:value="3100c5a6401376fafb134b3000e78233a9a7f693" /> 

     <!-- For widget --> 
     <activity 
      android:name=".Licenses" 
      android:label="@string/title_activity_licenses" 
      android:parentActivityName=".MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="MainActivity" /> 
     </activity> 








     <!-- Push Service --> 
     <service android:name="com.parse.PushService" /> 

     <receiver android:name="com.parse.ParseBroadcastReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <action android:name="android.intent.action.USER_PRESENT" /> 
      </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" /> 

       <category android:name="com.bordengrammar.bordengrammarapp" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 
+0

vérifier votre classe d'installation sur votre navigateur de données et voir s'il y a même plusieurs périphériques jeton – danieljohngomez

+0

Et comment peut-on faire @johngomez –

+2

@epicfinley Connectez-vous pour parse.com, accédez à votre tableau de bord, et vérifiez le navigateur de données, il vous verriez la table et les données pour la classe Parse Installation. Il semble que vous ayez des lignes en double pour le même jeton d'unité dans votre table d'installation d'analyse. Vous pouvez exécuter un travail cron pour supprimer les doublons et ne garder que le dernier mis à jour – ThiyagaB

Répondre

1

Connectez-vous pour parse.com, rendez-vous à votre tableau de bord, et vérifiez le navigateur de données, là vous verriez la table et les données pour la classe d'installation Parse. Il semble que vous ayez des lignes en double pour le même jeton d'unité dans votre table d'installation d'analyse. Vous pouvez exécuter une tâche cron pour supprimer les doublons et ne conserver que la dernière mise à jour un

+0

Cron Job !! Parse n'a pas d'emplois cron. – iTurki

+1

@iturki Je faisais référence aux travaux d'arrière-plan, s'il vous plaît se référer ici http://blog.parse.com/announcements/introducing-background-jobs/ – ThiyagaB

+1

Le problème n'est pas comment vous exécutez des requêtes dans vos données. C'est ainsi que vous identifiez les doublons dans vos données. Il est possible d'avoir plusieurs lignes dans vos données, avec des devicesTokens différents, qui pointent vers le même périphérique physique. – iTurki

1

Raison:

Cela se produit parce que chaque fois que vous installez l'application sur un dispositif (même), parse créer un nouveau enregistrer dans la classe 'Installation', ainsi deviceToken est dupliqué.

Solution:

Vous pouvez résoudre ce problème en trouvant pour l'entrée en double et d'éviter l'insertion dans la fonction « beforeSave » pour la classe « Installation ». Il est préférable d'écrire cette section en javascript et de passer au CloudCode. D'où la communication entre le client (android) et le serveur peut être réduite.

Parse.Cloud.beforeSave(Parse.Installation, function(request, response) { 
    if(!request.object.isNew()) {      // Old Obj - Updating 
     response.success(); 
    } else {           // New Obj - Inserting 
     Parse.Cloud.useMasterKey(); 
     var query = new Parse.Query(Parse.Installation); 
     query.equalTo("deviceToken", request.object.get("deviceToken")); 
     query.first().then(function(duplicate) { 
      if (typeof duplicate === "undefined") { 
       console.log("New installation .."); 
       response.success(); 
      } else { 
       console.log("Duplicate exist .."); 
       response.error();   
      } 
     }, function(error) { 
      console.warn(error.code + error.message); 
      response.error(); 
     }); 
    } 
}); 

Vous pouvez utiliser « deviceToken » ou votre champ personnalisé comme « userID » pour vérifier les doublons ou les deux selon vos besoins.

Mise à jour: Dans le code ci-dessus, j'ai juste évité l'entrée en double. Mais il est recommandé d'enlever l'existant et d'insérer le nouveau (comme ci-dessous).

Parse.Cloud.beforeSave(Parse.Installation, function(request, response) { 
    if(!request.object.isNew()) {      // Old Obj - Updating 
     response.success(); 
    } else {           // New Obj - Inserting 
     Parse.Cloud.useMasterKey(); 
     var query = new Parse.Query(Parse.Installation); 
     query.equalTo("deviceToken", request.object.get("deviceToken")); 
     query.first().then(function(duplicate) { 
      if (typeof duplicate === "undefined") { 
       console.log("New installation .."); 
       response.success(); // Allows Insertion 
      } else { 
       console.log("Duplicate exist .."); 
       duplicate.destroy(); // Removes old   
       response.success(); // Allows new insertion 
      } 
     }, function(error) { 
      console.warn(error.code + error.message); 
      response.error(); 
     }); 
    } 
}); 
+0

Je pense que ce code va supprimer l'installation mise à jour, pas l'ancienne. – iTurki

+1

Oui @iturki. Comme je l'ai déjà mentionné dans ma réponse, j'ai juste évité l'insertion en double (nouveau). Mais la bonne pratique consiste à supprimer l'existant et à insérer le nouveau. –

4

J'ai eu le même problème. Le problème était que le paramètre 'params' était nul lorsque j'appelais la fonction cloud. Quand j'ai mis des valeurs à cela, le problème a été résolu.