2017-04-18 161 views
0

我正在編寫自己的消息提供程序,以便在iOS和Android上發送推送通知。我有供應商在iOS上運行良好。我的問題是Android。在應用程序未運行時,手機會收到消息並通知用戶有消息。我只看到消息中的圖標。郵件正文不顯示。如果應用程序正在運行,應用程序將獲取消息事件,並且我可以在JSON中看到消息正文和消息標題。所以看來信息正在通過。我已經在運行JellyBean和Marshmallow的Android上嘗試了這一點,並獲得了相同的結果。我也嘗試使用谷歌測試通知從他們的網站FCM。我通過網絡通知發送獲得了相同的結果。有任何想法嗎?Android通知不顯示消息正文

這裏是我使用德爾福代碼:我發現我的問題

HttpClient.Request.URL := 'https://fcm.googleapis.com/fcm/send'; 

HttpClient.Request.ContentType := 'application/json'; 
HttpClient.Request.CustomHeaders.Add('Authorization: key = ***'); // Server Key from Google 
HttpClient.Request.CharSet := 'utf-8'; 

JSONMsg := TJSONObject.Create; 
JSONMsg.AddPair('to', devicetoken); 

JSONInfo := TJSONObject.Create; 
JSONInfo.AddPair('body', edtMessage.Text); 
JSONInfo.AddPair('title', 'CODY Mobility'); 
JSONInfo.AddPair('priority', 'high'); 
JSONTrue := TJsonTrue.Create; 
JSONFalse := TJsonFalse.Create; 
JSONInfo.AddPair('content_available', JSONTrue); 
JSONInfo.AddPair('dry_run', JSONFalse); 

JSONToSend := TStringStream.Create(JSONMsg.ToString, TEncoding.UTF8); 

StatusMemo.Lines.Add('Sending Android message to device: ' + deviceToken); 
try 
    HttpClient.Post('https://fcm.googleapis.com/fcm/send', JSONToSend); 
except 
    on E:Exception do begin 
     StatusMemo.Lines.Add('Message send failed: ' + E.Message); 
    end; 
end; 

StatusMemo.Lines.Add('Android message response: ' + HttpClient.ResponseText); 
FreeAndNil(JSONTrue); 
FreeAndNil(JSONFalse); 
+0

您是否嘗試過發送['data'](https://developers.google.com/cloud-messaging/concept-options#notifications_and_data_messages) - 僅*信息有效載荷爲Android?有了這個,它肯定你的應用程序應該是處理通知的應用程序,而不是系統托盤。 –

+0

是的,我確實嘗試發送一個數據只有有效載荷,但這並沒有解決我的問題。我希望能夠在應用程序未運行時向手機發送消息並顯示消息。當應用程序運行時,應用程序獲取有效載荷,數據或通知中的所有信息,應用程序可以毫無問題地顯示這些信息。 –

+0

嗨,喬。所以你的意思是說,你的應用程序能夠在前臺和後臺接收消息,並且即使你的應用程序已關閉或被終止,你也只想接收消息。是對的嗎? –

回答

0

!這似乎是德爾福的一個錯誤。我發送原始消息是:

{"to":<MyDeviceID>","notification":{"body":"It finally works!!!!!","title":"CODY Mobility Title","priority":"high","content_available":false,"dry_run":false}} 

如果我改變我的消息下面,現在的作品:

{"to":"<MyDeviceID>","data":{"message":"It finally works!!!!!","title":"CODY Mobility Title","priority":"high","content_available":false,"dry_run":false}} 

我不得不從「通知」到「數據」改變,我不得不改變將「body」元素轉換爲「message」元素。通過這些更改,手機會在應用程序關閉時獲取並顯示消息。當然,這不再符合Google發送Firebase雲消息通知的規格。我深入Delphi代碼,發現一個名爲NotificationPublisher.Java的Delphi java腳本。在那裏,有專門查找消息元素的代碼。

if (jsonVal != null) { 
if (jsonVal.has("message")) 
{ msg = jsonVal.optString("message"); } 

else if (jsonVal.has("msg")) 
{ msg = jsonVal.optString("msg"); } 

else if (jsonVal.has("alert")) 
{ msg = jsonVal.optString("alert"); } 

if (jsonVal.has("title")) 
{ title = jsonVal.optString("title"); } 

} 
} else { 
// Look for msg or message in bundle 
if (key.equals("message")) 
{ msg = valstr; } else if (key.equals("msg")) { msg = valstr; } 

if (key.equals("title")) 
{ title = valstr; } 
} 

我不確定在哪裏檢查通知元素與數據元素。但我相信這是問題的一部分。我創建了一張支持票據,因此Embarcadero可以進一步研究這一點。如果其他人有這個問題...只要改變你的消息,它會工作。