(新)GCM 消息收到,但如何解析?

Posted

技术标签:

【中文标题】(新)GCM 消息收到,但如何解析?【英文标题】:(New) GCM message received, but how to parse? 【发布时间】:2013-07-19 23:41:57 【问题描述】:

我正在使用“新”GCM,它是 Google Play 服务的一部分,它不为 android 和服务器使用 jar。 Android 使用 Google Play apk 注册、接收甚至发送消息。在服务器端,我们与 GCM 通信所需的只是对他们的服务器进行 POST(如果不使用 XMPP)。我已经准备好了:我的 Android 应用注册并等待来自 GCM 的消息。我的服务器可以与 GCM 通信,并且我可以将消息传递到我的 Android 应用。

问题:我正在使用一个带有 POJO 对象的通用 jar(Android 和服务器),我在 JSON 之间进行转换。由于从我的服务器到 GCM 的 POST 使用 JSON 并且在我的 Android 使用中也接收到消息(至少我相信是这样),我认为这会让我的生活更轻松。但是当在 Android 中接收来自 GCM 的消息时,我不知道如何获取消息的有效负载并转换为我的对象。我可以在那里看到信息,但它不是我的对象(有一些信息 GCM 推入其中)。

我的问题是:有没有办法在 Android 端以我发送到 GCM 服务器的方式获取有效负载信息?或者我应该在没有 JSON 的情况下在 Android 中解析接收到的数据? p>

我发送的消息(“数据”是有效负载)

"registration_ids":["APA91bFdV..."],"collapse_key":null,"delay_while_idle":false,"time_to_live":2419200,"data":"type":10,"targetVersion": -1,"message":"test msg","url":"test url"

我在 Android intent.getExtras().toString() 中得到了什么

捆绑[message=test msg, collapse_key=do_not_collapse, targetVersion=-1, from=483833987130, type=10, url=test url]

感谢您的帮助。谢谢!

【问题讨论】:

【参考方案1】:

有没有办法在 Android 端以我发送到 GCM 服务器的方式获取有效负载信息?

与其考虑“JSON”,不如考虑“键/值对”。您的服务器以键/值对的形式发送数据。您的应用程序在 Intent 的附加信息中以键/值对的形式接收该数据。您知道您的键是什么,因此只需从与这些键关联的附加项中检索值(例如,getStringExtra("message")getStringExtra("url"))。

或者我应该在没有 JSON 的情况下在 Android 中解析接收到的数据?

接收到的数据不是 JSON 格式。

【讨论】:

如何在java中定义苹果和安卓的模型类?【参考方案2】:

您必须向 json 数据添加另一个级别,显然它们不会递归解析 json。 发送:

...., "data":"payload":"id":5,"a":5

然后在代码中:

String json = intent.getExtras().getString("payload");
// json = "id":5,"a":5

这可以很容易地转换为 POJO,对我来说,如果你已经有类,这种方法会更好(或者只是想使用对象而不是 get...(“xyz”)

【讨论】:

感谢您的这项小工作。 Google 为我们提供了 4kb 的有效负载,所以我想使用它而不是“tickle”,后者会使用另一个 API 调用我的后端。干杯!【参考方案3】:

这是我为获取数据所做的...我认为这会对您有所帮助..

这是我从 UrbanAirship 推送通知中得到的回复。

Bundle[com.urbanairship.push.ALERT=, content-available=1, newscategorycode=O21R97, priority=5, com.urbanairship.push.PUSH_ID=afc9e690-f308-11e4-af8c-001018957618, id=6534.0 , from=966150816212, func=News, newscategory=HR, com.urbanairship.push.APID=28e48c60-324b-456c-95b5-8fde9ab1a956, collapse_key=do_not_collapse, com.urbanairship.push.CANONICAL_PSH_ID=7641453d-9207-4213- -404387583de7]

解决方案:

    Bundle bundle = message.getPushBundle();

在你的情况下获取捆绑对象然后像这样使用......

    String func = bundle.getString("func");
    String newscategory = bundle.getString("newscategory");
    String sinceId = bundle.getString("id");

你会得到数据..

编码愉快!

【讨论】:

以上是关于(新)GCM 消息收到,但如何解析?的主要内容,如果未能解决你的问题,请参考以下文章

GCM:如果应用程序不可见,则不会收到 IntentService.sentBroadcast 的消息

如何使用 GCM 在 Android 中解析或实际获取推送消息

APP收到GCM消息时启动声音/警报

GCM 在服务器上多次收到相同的消息

java中的XMPP服务器没有收到来自GCM服务器的所有消息

Android GCM 不向设备发送通知消息