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

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

解决方案: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;
        }
...
}
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉亭下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值