(新)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 中解析或实际获取推送消息