Android通知不显示消息正文
问题描述:
我正在编写自己的消息提供程序,以便在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);
答
!这似乎是德尔福的一个错误。我发送原始消息是:
{"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可以进一步研究这一点。如果其他人有这个问题...只要改变你的消息,它会工作。
您是否尝试过发送['data'](https://developers.google.com/cloud-messaging/concept-options#notifications_and_data_messages) - 仅*信息有效载荷为Android?有了这个,它肯定你的应用程序应该是处理通知的应用程序,而不是系统托盘。 –
是的,我确实尝试发送一个数据只有有效载荷,但这并没有解决我的问题。我希望能够在应用程序未运行时向手机发送消息并显示消息。当应用程序运行时,应用程序获取有效载荷,数据或通知中的所有信息,应用程序可以毫无问题地显示这些信息。 –
嗨,乔。所以你的意思是说,你的应用程序能够在前台和后台接收消息,并且即使你的应用程序已关闭或被终止,你也只想接收消息。是对的吗? –