我正在通过Urban Airship从我自己的服务器发送推送通知到基于PhoneGap的Android应用程序。通知已成功发送 - 但是,我希望能够发送未在Android通知栏中显示的其他数据,但我仍然可以在应用内提取。正如我所理解的那样,这应该被存储为推送通知的“额外”字段中的键值对。我有麻烦编码和以正确的方式提取它。
服务器是一个简单的ASP.NET Web界面,带有代码隐藏页面,可将消息发送到Urban Airship(基于此https://stackoverflow.com/a/2528151/1822286)。我使用JavaScript和JSON将数据从用户的交互(包括填写的表单和导入的Google Maps实例的坐标)保存到隐藏字段中。然后,该字段由ASP.NET中的代码隐藏页面读取,用于构造推送通知。
JavaScript隐藏字段stringData(事件变量来自Google地图实例,我已经在这里留下了部分,因为该部分有效):
var allDataToString = {
"alert": "\"" + document.getElementById("alertTextBox").value + "\"",
"data": "\"" + document.getElementById("dataTextBox").value + "\"",
"lat": "\"" + event.latLng.lat() + "\"",
"lng": "\"" + event.latLng.lng() + "\""
};
document.getElementById("stringData").value = JSON.stringify(allDataToString);
C#代码隐藏页面中的推送通知消息:
string postData = "{\"aliases\": [],\"tags\": [],\"android\": {\"alert\": \"alerttest\",\"extra\": {\"data\": \"" + stringData.Value + "\", \"notificationtype\": \"1\"}},\"apids\": [\"APID\"]}";
更易阅读的版本:
string postData =
"{
\"aliases\": [],
\"tags\": [],
\"android\":
{
\"alert\": \"alerttest\",
\"extra\":
{
\"data\": \"" + stringData.Value + "\",
\"notificationtype\": \"1\"
}
},
\"apids\": [\"APID\"]
}";
消息通过Urban Airship成功发送到我的手机。在应用程序中,我想提取stringData.Value部分,其中包含alert,data,lat和lng变量。我不确定错误是否在于我选择对服务器端进行编码的方式,或者是我在客户端解析它的方式。令人困惑的是,Urban Airship的文档和Web仪表板之间的术语不同,使用“alert”和“extra”,而PhoneGap插件侧的其他内容称为“incoming”和“incoming.message”。
在PhoneGap JavaScript中:
push.getIncoming(function(incoming) {
if(incoming.extra!=undefined){
var data = JSON.parse(incoming.extra.data);
var alert = data.alert;
var data = data.data;
var lat = data.lat;
var lng = data.lng;
}
});
提前致谢。
答案 0 :(得分:0)
解决了它。我使用Urban Airship仪表板在PhoneGap中尝试了不同的提取组合,而不是从我自己的服务器发送消息,以最大限度地减少错误源的数量。在服务器端,我怀疑问题是在尝试发送字符串化的JSON对象时,因为引号会干扰消息的其余部分中的引号。将它们作为单独的键值对发送工作正常:
string postData = "{\"aliases\": [],\"tags\": [],\"android\": {\"alert\": \"" + someAlertValue + "\",\"extra\": {\"someKey\": \"" + someDataValue + "\", \"someKey2\": \"" + anotherDataValue + "\"}},\"apids\": [\"some apid\"]}";
在PhoneGap中提取“额外”消息的方法是:
var extra = incoming.extras;
提取的每个键值对:
var someDataValue = extra.someKey;
var anotherDataValue = extra.someKey2;