2016-08-19 62 views
5

我在我的應用程序中實施FCM(Firebase消息傳遞服務)。這裏一切似乎都很好,除非應用程序處於後臺狀態時,我無法提取預期的通知數據。當應用程序處於後臺狀態時,Google FCM getIntent不返回預期數據

基於概念:有在FCM兩種類型的消息:

顯示的消息:這些消息只有當你的應用程序在前臺工作。

數據的消息:論文信息工作,即使你的應用程序在後臺 當我們的應用程序是在後臺,Android的指示通知消息到系統托盤。

處理數據的消息您的通知應該有click_action = 「YOUR_ACTION」場。

我的消息將是這樣的:

{ 
"data": { 
    "body": "here is body", 
    "title": "Title", 
    "click_action": "YOUR_ACTION" 
}, 
"to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb" 
} 

活動將顯示該清單文件會喜歡這樣的消息:

<activity 
      android:name=".NotificationActivity" 
      android:screenOrientation="portrait" 
      android:theme="@style/Theme.AppCompat.Dialog" 
      android:windowSoftInputMode="stateHidden" > 

      <intent-filter> 
       <action android:name="YOUR_ACTION" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 

點擊通知後,它會重定向到我NotificationActivity。在我NotificationActivityonCreateonNewIntent方法,我用這種方式提取消息:

Bundle bundle=getIntent().getExtras(); 
     if(bundle!=null) { 
      for (String key : bundle.keySet()) { 
       Object value = bundle.get(key); 
       Log.d("DATA_SENT", String.format("%s %s (%s)", key, 
         value.toString(), value.getClass().getName())); 
      } 
     } 

不幸的是我的NotificationActivity我得到下面的消息是:

google.sent_time:1471631793774

:50711789666

google.message_id 0:1471631793776823%098e508d098e508d

collapse_key的:com.myapp.package_name

哪裏是我的預期通知數據?

這裏是我的系統配置:

的Android Studio版本:2.1.3

火力地堡版本:com.google.firebase:火力-AUTH:9.0.1

Google Play服務版本:com.google.android.gms:play-services:9.2。1

下面是一些相關鏈接:

在此先感謝。對不起,英文不好。

+0

請問您可以發佈您的onMessageReceived方法嗎?我認爲問題可能在於此方法,因此NotificationActivity未收到通知數據。 – GeorgeLBA

回答

11

上側的android解決方案是正確的。實際上,通知消息是問題所在。它向我發送「數據」對象而不是「通知」對象。我的TargetActivity中缺少「通知」對象沒有收到使用getIntent()的消息。發送「通知」對象後,它解決了我的問題。

正確的消息格式波紋管式給出:

{ 
"data": { 
    "body": "here is body", 
    "title": "Title" 
}, 
"notification": { 
    "body": "here is body", 
    "title": "Title", 
    "click_action": "YOUR_ACTION" 
}, 
"to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb" 
} 

這裏是關於火力的消息更明確的概念。我從他們的支持團隊找到了它。 火力地堡有三個消息類型

通知消息:在背景或前景通知消息的工作。當應用程序處於後臺時,通知消息將傳遞到系統托盤。如果應用程序位於前臺,則消息由onMessageReceived()或didReceiveRemoteNotification回調處理。這些本質上就是所謂的顯示消息。

數據信息:在Android平臺上,數據信息可以在後臺和前臺工作。數據消息將由onMessageReceived()處理。 這裏有一個特定於平臺的說明:在Android上,可以在用於啓動活動的Intent中檢索數據有效負載。詳細說明一下,如果您有「click_action」:「launch_Activity_1」,則可以通過僅來自Activity_1的getIntent()檢索此意圖。

消息使用二者通知和數據有效載荷: 當在背景中,應用接收在通知托盤中的通知有效載荷,並且當用戶點按通知僅處理所述數據有效負載。 在前臺時,您的應用程序會收到一個消息對象,其中包含兩個可用的有效內容。 其次,click_action參數通常用於通知有效內容,而不是數據有效內容。如果在數據有效內部使用,則此參數將被視爲自定義鍵值對,因此您需要實現自定義邏輯才能按預期工作。

此外,我建議您使用onMessageReceived方法(請參閱數據消息)來提取數據包。從您的邏輯中,我檢查了捆綁對象並沒有找到預期的數據內容。以下是對可能提供更清晰的類似案例的參考。

+1

正確。您也可以在Firebase控制檯中執行此操作。在'高級選項'下面填寫'自定義數據'作爲鍵值對。然後,您可以從「意圖」中獲取數據。getExtra()'; – bjiang

+0

謝謝。這是我的新信息。 –

+1

很高興找到解決方案。您能否編輯原始問題以澄清段落「display-messages:這些消息僅在您的應用處於前景時才起作用。」與「顯示信息是:自動顯示在通知托盤如果應用程序在後臺,觸發onMessageReceived()如果應用程序在前臺。」 ? 請參閱:https://firebase.google.com/docs/cloud-messaging/concept-options#messages-with-both-notification-and-data-payloads 非常感謝,如果問題不清楚,請繼續問問題! –

相關問題