初次使用极光推送,文档没仔细看,就和服务端写了个简单的文本推送,测试后就这样用了。后来功能变更,发现不是那么回事。主要体现在,推送通知的处理不当,导致显示的是json内容。后来查看文档才发现,通知里面有规定的,是我们漏了很多东西,然后推荐给服务端查看后,经过商讨,重新更改才解决了问题。现在发出来与大家共勉。。。
通知栏显示json的原因是:服务端没有按文档要求,直接把推送内容,放在了alert里面。(alert是,通知是内容部分,所以就展示出来了)。
应该放在extra里面,这里面才是前端需要解析的json内容。
极光推送官方给出的Json格式:
{ "platform": "all", "audience" : { "tag" : ["深圳", "北京"] }, "notification" : { "android" : { "alert" : "Hi, JPush!", "title":"Send to Android", "builder_id":1, "extras" : { "newsid" : 321} }, "ios" : { "alert" : "Hi, JPush!", "sound":"default", "badge":"+1", "extras" : { "newsid" : 321} } }, "options" : { "time_to_live" : 60,"apns_production":false } }
JpushReceiver类的解释:
/** * 自定义接收器 * * 如果不定义这个 Receiver,则: 1) 默认用户会打开主界面 2) 接收不到自定义消息 */ public class JpushReceiver extends BroadcastReceiver { /** SDK 向 JPush Server 注册所得到的注册 全局唯一的 ID */ private final String REGISTRATION_ID = JPushInterface.ACTION_REGISTRATION_ID; /** 收到了自定义消息 Push */ private final String MESSAGE_RECEIVED = JPushInterface.ACTION_MESSAGE_RECEIVED; /** 收到了通知 Push */ private final String NOTIFICATION_RECEIVED = JPushInterface.ACTION_NOTIFICATION_RECEIVED; /** 用户点击了通知 */ private final String NOTIFICATION_OPENED = JPushInterface.ACTION_NOTIFICATION_OPENED; /** 在HTML中调用此函数后,会以广播的形式传递 ”params“ 到应用程序并触发客户端动作 */ private final String RICHPUSH_CALLBACK = JPushInterface.ACTION_RICHPUSH_CALLBACK; /** 获取推送连接状态 */ private final String CONNECTION_CHANGE = JPushInterface.ACTION_CONNECTION_CHANGE; @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); // printBundle(bundle) String action = intent.getAction(); if (REGISTRATION_ID.equals(action)) { // SDK 向 JPush Server 注册所得到的注册 全局唯一的 ID String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); } else if (MESSAGE_RECEIVED.equals(action)) {// 自定义消息不会展示在通知栏,完全要开发者写代码去处理 // 服务器推送下来的消息的标题(对应 API 消息内容的 title 字段;Portal 推送消息界上不作展示) String title = bundle.getString(JPushInterface.EXTRA_TITLE); // 服务器推送下来的消息内容(对应 API 消息内容的 message 字段;对应 Portal // 推送消息界面上的"自定义消息内容”字段。) String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); // 服务器推送下来的附加字段。这是个 JSON 字符串。(对应 API 消息内容的 extras 字段;对应 Portal // 推送消息界面上的“可选设置”里的附加字段) String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); // 服务器推送下来的内容类型(对应 API 消息内容的 content_type 字段) String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE); // 富媒体通消息推送下载后的文件路径和文件名 String file = bundle.getString(JPushInterface.EXTRA_RICHPUSH_FILE_PATH); // 标识消息的 ID, 可用于上报统计 String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID); /** 处理推送的消息 */ JpushProcess.processPushMessage(context, bundle); } else if (NOTIFICATION_RECEIVED.equals(action)) {// 接收到推送下来的通知,在这里可以做些统计,或者做些其他工作 // 服务器推送下来的通知的标题(对应 API 通知内容的 title 字段;对应 Portal 推送通知界面上的“通知标题”字段) String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE); // 服务器推送下来的通知内容(对应 API 通知内容的 alert 字段;对应 Portal 推送通知界面上的“通知内容”字段) String content = bundle.getString(JPushInterface.EXTRA_ALERT); // 服务器推送下来的附加字段。这是个 JSON 字符串。(对应 API 通知内容的 extras 字段;对应 Portal // 推送消息界面上的“可选设置”里的附加字段) String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); // 通知栏的Notification ID,可以用于清除Notification int notificationId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); // 服务器推送下来的内容类型(对应 API 消息内容的 content_type 字段;Portal 上暂时未提供输入字段。) String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE); // 体通知推送下载的HTML的文件路径,用于展现WebView String fileHtml = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_PATH); // 富媒体通知推送下载的图片资源的文件名,多个文件名用 “,” 分开。 与 // “JPushInterface.EXTRA_RICHPUSH_HTML_PATH” 位于同一个路径 String fileStr = bundle.getString(JPushInterface.EXTRA_RICHPUSH_HTML_RES); String[] fileNames = fileStr.split(","); // 通知消息的 ID, 可用于上报统计 String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID); } else if (NOTIFICATION_OPENED.equals(action)) {// 用户点击打开了通知,定义用户点击后的行为 // 打开自定义的Activity // Intent i = new Intent(context, TestActivity.class); // i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // context.startActivity(i); // 保存服务器推送下来的通知的标题(对应 API 通知内容的 title 字段;对应 Portal // 推送通知界面上的“通知标题”字段.) String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE); // 服务器推送下来的通知内容(对应 API 通知内容的alert字段;对应 Portal 推送通知界面上的“通知内容”字段) String content = bundle.getString(JPushInterface.EXTRA_ALERT); // 服务器推送下来的附加字段。这是个 JSON 字符串(对应 API 消息内容的 extras 字段;对应 Portal // 推送消息界面上的“可选设置”里的附加字段) String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); // 通知栏的Notification ID,可以用于清除Notification int notificationId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); // 通知消息的 ID, 可用于上报统计 String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID); /** 处理点击推送的通知 */ JpushProcess.processPushNotification(context, bundle); } else if (RICHPUSH_CALLBACK.equals(action)) { // 在HTML中调用此函数后,会以广播的形式传递 ”params“ 到应用程序并触发客户端动作 // 根据extra的内容处理代码,比如打开新的Activity,打开一个网页等.. String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); } else if (CONNECTION_CHANGE.equals(action)) {// 获取推送连接状态 boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false); } } /** * 打印所有的 intent extra 数据 * * @param bundle * @return */ public static String printBundle(Bundle bundle) { StringBuilder sb = new StringBuilder(); for (String key : bundle.keySet()) { if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) { sb.append("\nkey:" + key + ", value:" + bundle.getInt(key)); } else if (key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)) { sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key)); } else { sb.append("\nkey:" + key + ", value:" + bundle.getString(key)); } } return sb.toString(); } /** * 本地通知API * * 本地通知API不依赖于网络,无网条件下依旧可以触发 * * 本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制 * * 本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响 */ public void localNotification(Context context) { JPushLocalNotification localNotification = new JPushLocalNotification(); localNotification.setBuilderId(0);// 设置本地通知样式 localNotification.setTitle("本地通知测试");// 设置本地通知的title localNotification.setContent("上宾本地通知测试");// 设置本地通知的content localNotification.setExtras(""); // 设置额外的数据信息extras为json字符串 localNotification.setNotificationId(11111111);// 设置本地通知的ID localNotification.setBroadcastTime(System.currentTimeMillis() + 1000 * 60 * 10);// 设置本地通知触发时间 // 增加一个本地通知 JPushInterface.addLocalNotification(context, localNotification); // 移除指定的本地通知 JPushInterface.removeLocalNotification(context, localNotification.getNotificationId()); // 移除所有的本地通知 JPushInterface.clearAllNotifications(context); } }
推送的通知和消息的处理:
public class JpushProcess { /** * 处理点击推送的通知 * * @param context * @param bundle */ public static void processPushNotification(Context context, Bundle bundle) { // 服务器推送下来的消息的标题(对应 API 消息内容的 title 字段;Portal 推送消息界上不作展示) String title = bundle.getString(JPushInterface.EXTRA_TITLE); // 服务器推送下来的消息内容(对应 API 消息内容的 message 字段;对应 Portal // 推送消息界面上的"自定义消息内容”字段。) String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); // 服务器推送下来的附加字段。这是个 JSON 字符串。(对应 API 消息内容的 extras 字段;对应 Portal // 推送消息界面上的“可选设置”里的附加字段) String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); // 服务器推送下来的内容类型(对应 API 消息内容的 content_type 字段) String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE); // 富媒体通消息推送下载后的文件路径和文件名 String file = bundle.getString(JPushInterface.EXTRA_RICHPUSH_FILE_PATH); // 标识消息的 ID, 可用于上报统计 String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID); // 上报用户的通知栏被打开,或者用于上报用户自定义消息被展示等客户端需要统计的事件 JPushInterface.reportNotificationOpened(context, msgId); // 清除所有Notification // JPushInterface.clearAllNotifications(context); // 清除Notification // JPushInterface.clearNotificationById(context, notificationId); setPushNotification(context, extra); } /** * 处理推送的消息 * * @param context * @param bundle */ public static void processPushMessage(Context context, Bundle bundle) { // 服务器推送下来的消息的标题(对应 API 消息内容的 title 字段;Portal 推送消息界上不作展示) String title = bundle.getString(JPushInterface.EXTRA_TITLE); // 服务器推送下来的消息内容(对应 API 消息内容的 message 字段;对应 Portal // 推送消息界面上的"自定义消息内容”字段。) String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); // 服务器推送下来的附加字段。这是个 JSON 字符串。(对应 API 消息内容的 extras 字段;对应 Portal // 推送消息界面上的“可选设置”里的附加字段) String extra = bundle.getString(JPushInterface.EXTRA_EXTRA); // 服务器推送下来的内容类型(对应 API 消息内容的 content_type 字段) String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE); // 富媒体通消息推送下载后的文件路径和文件名 String file = bundle.getString(JPushInterface.EXTRA_RICHPUSH_FILE_PATH); // 标识消息的 ID, 可用于上报统计 String msgId = bundle.getString(JPushInterface.EXTRA_MSG_ID); setPushMessage(context, message); } /** * 推送的通知 * * @param context * @param msg */ private static void setPushNotification(Context context, String extra) { JSONObject object = null; try { object = new JSONObject(extra); } catch (JSONException e) { e.printStackTrace(); } Bundle bundleData = new Bundle(); if (object != null) { bundleData.putString("brandName", object.optString("brandName")); bundleData.putString("shopId", object.optString("shopId")); bundleData.putString("contactId", object.optString("id")); } String token = AppConfig.getData(context, AppConfig.APP_USER_TOKEN); if (!StringUtils.isEmpty(token)) { Intent intentData = new Intent(); intentData.setClass(context, ContactInfoActivity.class); intentData.putExtras(bundleData); Intent[] intents = new Intent[2]; Intent intentMain = new Intent(); intentMain.setClass(context, MainActivity.class); intents[0] = intentMain; intents[1] = intentData; context.startActivities(intents); } }