使用极光推送,使用别名来作为设备标识来进行推送。当用户切换时,可能存在下一个用户收到上一个用户的推送消息的情况。
解决方案: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;
}
...
}
}
如果发现接收到了消息,但实际当前账户的别名还未成功,则将消息遗弃。这样就能确保收到的消息是本账号的消息了。设置别名有一定概率失败的情况,失败时需要有重试机制。