记一次信鸽推送的坑

最近接手项目推送这一块的东西,接的信鸽推送,之前的开发在跟后台的调试时没有确定好推送消息类型,结果就出现坑了!!

一、信鸽推送的消息类型分两种:

推送通知(展现在通知栏):

指的是在设备的通知栏展示的内容,由信鸽SDK完成所有的操作,APP可以监听通知被打开的行为,也就是说在前台下发的通知不需要APP做任何处理,默认会展示在通知栏。成功注册信鸽服务后,通常不需要任何设置便可下发通知。通常来说,结合自定义通知样式,常规的通知能够 满足大部分业务需求,如果需要更灵活的方式请考虑使用消,就是信鸽会自动显示通知栏消息,无需用户自己处理。这个推送通知会回调方法:


记一次信鸽推送的坑_第1张图片
image.png

默认通知栏点击事件就是跳转参数里面带的Activity。如果后台不设置的话就直接重启APP了,

应用内消息命令(消息不展示到通知栏)

指的是由信鸽下发给APP的内容,需要APP继承XGPushBaseReceiver接口实现并自主处理所有操作过程,也就是说,下发的消息默认是不会展示在通知栏的,信鸽只负责将消息从信鸽服务器下发到APP这个过程,不负责消息的处理逻辑,需要APP自己实现。具体可参考Demo中MessageReceiver。

消息指的是由开发者通过前台或后台脚本下发的文本消息,信鸽只负责将消息传递给APP,APP完全自主负责消息体的处理。

消息具有灵活性强和高度定制性特点,因此更适合APP自主处理个性化业务需求,比如下发APP配置信息、自定义处理消息的存储和展示等。

例如:某游戏需要针对不同情景(用户升级提示、版本更新提示、活动营销提示等)提供不同的通知,可以把这些情景以json格式封装在消息,下发到APP,然后APP根据这些场景提供不同的提示,满足个性化需求。











获取应用内消息

开发者在前台下发消息,需要APP继承XGPushBaseReceiver重载onTextMessage方法接收,成功接收后,再根据特有业务场景进行处理。

同时,XGPushBaseReceiver还提供其它相关的接口,如通知被展示、被点击的结果反馈、注册/反注册结果反馈等,请参考“XGPushBaseReceiver”章节或demo中的MessageReceiver类。

请确保在AndroidManifest.xml已经注册过该receiver,即设YOUR_PACKAGE.XGPushBaseReceiver。
public void onTextMessage(Context context,XGPushTextMessage message)

正常的话应该是在onTextMessage方法里面处理消息事件。之前的开发没有跟后台协调好,导致后台推送的都是通知消息,每次点击通知栏消息都是启动APP首页。无法灵活处理自定义通知栏。如果要改动的话后台,iOS、android三方都要改动,避免改动太大,现在就只有Android自己去规避了。

二、处理办法

1.在点击通知栏的启动首页APP的时候,在onCreate判断是否是通知栏启动的,直接finish掉。

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 判断是否从推送通知栏打开的
        XGPushClickedResult click = XGPushManager.onActivityStarted(this);
        if (click != null) {
            //从推送通知栏打开-Service打开Activity会重新执行Laucher流程
            //查看是不是全新打开的面板
            if (isTaskRoot()) {
                return;
            }
            //如果有面板存在则关闭当前的面板
            finish();
        }
}

2.然后监听通知栏点击事件。


    @Override
    public void onNotifactionClickedResult(Context context, XGPushClickedResult xgPushClickedResult) {
        Log.d(TAG, "onNotifactionClickedResult"+xgPushClickedResult.toString());
        String text = "";
        if (xgPushClickedResult.getActionType() == XGPushClickedResult.NOTIFACTION_CLICKED_TYPE) {
            // 通知在通知栏被点击啦。。。。。
            // APP自己处理点击的相关动作
            // 这个动作可以在activity的onResume也能监听,请看第3点相关内容
            text = "通知被打开 :";
        } else if (xgPushClickedResult.getActionType() == XGPushClickedResult.NOTIFACTION_DELETED_TYPE) {
            // 通知被清除啦。。。。
            // APP自己处理通知被清除后的相关动作
            text = "通知被清除 :";
        }
        Log.d(TAG, "onNotifactionClickedResult==" + text);
  
    }
    private void showNotify(String Action, XGPushShowedResult xgPushShowedResult) {
        IntentFilter filter_click = new IntentFilter();
        filter_click.addAction(Action);
        //注册广播
        registerReceiver(receiver_onclick, filter_click);

        Intent Intent_pre = new Intent(Action);
        PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, Intent_pre, 0);

        int smallIcon = R.drawable.ic_launcher;
        String ticker = "您有一条新通知";
        String title = xgPushShowedResult.getTitle();
        String content = xgPushShowedResult.getContent();
        //实例化工具类,并且调用接口
        NotifyUtil notify2 = new NotifyUtil(GlobalMsgService.this, id);
        notify2.notify_normail_moreline(pIntent, smallIcon, ticker, title, content, true, true, false);
    }

 private BroadcastReceiver receiver_onclick = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(NOTIFICATION_HABIT_TOFORNT)) {
                Log.d("MyService", "点击通知栏");
                if (MyLifecycleHandler.isIsForeground()) {

                } else {
                     
                    }
                }
            } else if (intent.getAction().equals(NOTIFICATION_USER_CENTER)) {//跳转个人中心

            }
        }
    };

最后想说,在接入第三方SDK时还是要看清楚相应的方法避免出现这种乌龙。

你可能感兴趣的:(记一次信鸽推送的坑)