极光推送初遇

初次使用极光推送,文档没仔细看,就和服务端写了个简单的文本推送,测试后就这样用了。后来功能变更,发现不是那么回事。主要体现在,推送通知的处理不当,导致显示的是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);
        }

    }




你可能感兴趣的:(Android)