极光账号切换导致的推送问题

2020-02-17  本文已影响0人  神迹12

使用极光推送,使用别名来作为设备标识来进行推送。当用户切换时,可能存在下一个用户收到上一个用户的推送消息的情况。

解决方案:2种思路。前置操作:账户登出后,将极光别名置空,停止推送stopPush。1、每次登录时监听设置别名(alias)的结果,只有设置的别名和当前用户的别名一直,并且设置结果成功后,再开启推送resumePush。2、每次登录时开启推送resumePush,设置别名,监听别名设置结果,在接收极光推送消息时判断当前用户别名是否已注册成功,若还没成功,则不处理消息。总结起来就是当前用户别名未注册成功不开启推送,另一种是开启推送,但过滤消息,当前用户别名未注册成功,则不处理接收到的消息。

实际使用第一种方法设置别名时会一直报6022错误码,查了后发现,要先调用resumePush后才能调用setAlias方法,所以只能暂时用法2。

登录成功后,先开启推送,设置别名

JPushReceiver.isAliasRegistered = false;
JPushInterface.resumePush(context);
JPushInterface.setAlias(context, 7777 alias);

这里以jpush 3.3.4版本为例。
在极光3.0.7版本之后,需要自定义一个广播接收者继承自JPushMessageReceiver。

public class JPushCustomMsgReceiver extends JPushMessageReceiver {
    private static final String TAG = "JPushCustomMsgReceiver";
    @Override
    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
//        Log.e(TAG, "onAliasOperatorResult: alias="+jPushMessage.getAlias()+" errorCode="+jPushMessage.getErrorCode()+" sequence="+jPushMessage.getSequence());
        //设置标签别名请注意处理 call back 结果,只有设置成功才可以向目标推送,否则服务器 API 会返回 1011 错误。
        //从v3.0.7版本开始,别名和标签是异步回调,注意在 AndroidManifest 里面配置自定义广播接收器
        //广播极光alias注册信息
        Intent intentRefresh = new Intent(ReceiverConstant.ACTION_RECEIVE_JPUSH_ALIAS_REGISTRY);
        intentRefresh.putExtra(UIConstant.INTENT_KEY_JPUSH_REGISTER_ALIAS, jPushMessage.getAlias());
        intentRefresh.putExtra(UIConstant.INTENT_KEY_JPUSH_REGISTER_ALIAS_RESULT, jPushMessage.getErrorCode());
        LocalBroadcastManager.getInstance(context).sendBroadcast(intentRefresh);
        super.onAliasOperatorResult(context, jPushMessage);
    }

···

}

将收到的别名设置结果(别名及错误码)保存下来进行判断处理。

    //极光注册别名广播
    private class JpushAliasReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            String alias = intent.getStringExtra(UIConstant.INTENT_KEY_JPUSH_REGISTER_ALIAS);
            int errorCode = intent.getIntExtra(UIConstant.INTENT_KEY_JPUSH_REGISTER_ALIAS_RESULT,-1);
            //jpushAlia是当前登录用户的极光别名,JPushReceiver是自定义的实际用来接收极光消息的广播接收者
            if(!TextUtils.isEmpty(jpushAlias) && !TextUtils.isEmpty(alias) && errorCode==0){
                JPushReceiver.isAliasRegistered = true;
            }else{
                new Handler().postDelayed(new Runnable()) {
                    public void run() {
                    JPushInterface.resumePush(context);
                    JPushInterface.setAlias(context, 7777 alias);
                  }
                }, 3000);
            }
        }
    }

JpushReceiver是自定义的极光老版的消息广播接收者,用于接收极光推送消息。

public class JPushReceiver extends BroadcastReceiver {
    public static boolean isAliasRegistered = false;
    @Override
    public void onReceive(Context context, Intent intent) {
...
        if(!isAliasRegistered){
            return;
        }
...
}
}

如果发现接收到了消息,但实际当前账户的别名还未成功,则将消息遗弃。这样就能确保收到的消息是本账号的消息了。设置别名有一定概率失败的情况,失败时需要有重试机制。

极光社区相关问题的解答
https://community.jiguang.cn/question/134270

上一篇 下一篇

猜你喜欢

热点阅读