2014-06-24 26 views
2

當我發出推送通知時,5個相同的通知出現在設備上。任何理由?下面是我的application.java和清單:每次推送多個通知

公共類應用擴展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(); 
} 

我的清單:

<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

檢查您的數據瀏覽器上的安裝類,看看是否有相同的多設備令牌 – danieljohngomez

+0

@johngomez –

+2

@epicfinley登錄parse.com,轉到您的儀表板,並檢查數據瀏覽器,那裏你會看到Parse安裝類的表和數據。看起來你的分析安裝表中有相同的設備標記重複的行。您可以運行cron作業來刪除重複項,並只保留最新的更新項 – ThiyagaB

回答

1

登錄parse.com,去你的儀表板,然後檢查數據瀏覽器,在那裏您將看到Parse安裝類的表和數據。看起來你的分析安裝表中有相同的設備標記重複的行。您可以運行一個cron作業來刪除重複項,只保留最近更新的一個

+0

Cron工作!解析沒有cron作業。 – iTurki

+1

@iturki我指的是後臺作業,請參閱http://blog.parse.com/announcements/introducing-background-jobs/ – ThiyagaB

+1

問題不在於如何在數據中運行查詢。這是你如何_identify重複您的data_。您的數據中可能有多行,包含不同的deviceToken,這些行指向相同的物理設備。 – iTurki

1

原因:

這是因爲每次你安裝一個(下同)設備上的應用,分析將創建一個新的記錄在'安裝'類中,因此deviceToken被複制。

解決方案:

您可以通過找出重複條目解決這個問題,避免「beforeSave」功能「安裝」類的插入。最好在JavaScript中編寫此部分並移至CloudCode。因此可以減少客戶端(android)設備和服務器之間的通信。

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(); 
     }); 
    } 
}); 

您可以使用「deviceToken」或您的自定義字段,如「用戶ID」檢查副本或兩者按您的需求。

更新: 在上面的代碼中,我剛剛避免了重複條目。但是最好刪除現有的並插入新的(如下)。

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

我認爲這段代碼會刪除更新的安裝,而不是舊的。 – iTurki

+1

是@iturki。正如我在我的回答中已經提到的,我只是避免了重複插入(新的插入)。但最好的做法是刪除現有的並插入新的。 –

4

我有同樣的問題。問題是,當我調用雲功能時,'params'參數爲空。當我爲此付出價值時,問題就解決了。