【问题标题】:Android Notifications not display the message bodyAndroid 通知不显示消息正文
【发布时间】:2017-04-18 16:02:18
【问题描述】:

我正在编写自己的消息提供程序以在 iOS 和 Android 上发送推送通知。我的提供商在 iOS 上运行良好。我的问题是安卓。在应用程序未运行的情况下,手机会收到消息并通知用户有消息进来。我只看到消息中的图标。不显示消息正文。如果应用程序正在运行,应用程序会获取消息事件,我可以在 JSON 中看到消息正文和消息标题。所以看起来信息正在通过。我已经在运行 JellyBean 和 Marshmallow 的 Android 上进行了尝试,并得到了相同的结果。我还尝试使用 Google 的 FCM 网站上的测试通知。我通过他们的网络通知发送得到了相同的结果。有什么想法吗?

这是我在 Delphi 中使用的代码:

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

【问题讨论】:

  • 您是否尝试过为 Android 发送 data-only 消息负载?有了这个,可以确定你的应用应该是处理通知的那个,而不是系统托盘。
  • 是的,我确实尝试仅发送数据有效负载,但这并没有解决我的问题。当应用程序未运行时,我希望能够向手机发送和显示消息。当应用程序运行时,应用程序会获取有效负载、数据或通知中的所有信息,然后应用程序可以毫无问题地显示这些信息。
  • 嗨乔。因此,您的意思是说您的应用程序能够在前台和后台接收消息,并且即使您的应用程序关闭或终止,您也只想接收消息。对吗?
  • 正确。当应用程序关闭时,我希望 Android OS 显示消息文本。它显示的只是通知的应用程序图标。

标签: android delphi google-cloud-messaging


【解决方案1】:

我发现了我的问题!这似乎是德尔福的一个错误。我发送的原始消息是:

{"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}}

我必须从“通知”更改为“数据”,并且必须将“正文”元素更改为“消息”元素。完成这些更改后,手机会在应用程序关闭时获取并显示消息。当然,这不再符合 Google 使用 Firebase Cloud Messaging 发送通知的规范。我深入研究了 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; }
}

我不确定 Delphi 在哪里检查通知元素和数据元素。但我相信这是问题的一部分。我创建了一张支持票,以便 Embarcadero 可以进一步调查。如果其他人有此问题...只需更改您的消息即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多