2017-04-18 163 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可以进一步研究这一点。如果其他人有这个问题...只要改变你的消息,它会工作。