我正在使用FCM
为我的移动应用程序生成notification
。 它工作得很好,但是当我从帐户注销并使用另一个帐户登录时,我注意到发送了与第一个帐户相关的通知。 我该如何解决这个障碍? 我正在使用谷歌登录 发送到主题 消息传递服务
public class FirebaseMessagingService extends
com.google.firebase.messaging.FirebaseMessagingService {
public static final String TOKEN_BROADCAST = "mytokenbroadcast";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//____ID _____
int id = (int) System.currentTimeMillis();
//_____NOTIFICATION ID'S FROM FCF_____
String messageTitle = remoteMessage.getNotification().getTitle();
String messageBody = remoteMessage.getNotification().getBody();
String click_action = remoteMessage.getNotification().getClickAction();
String companyposition = remoteMessage.getData().get("id");
//String dataFrom=remoteMessage.getData().get("fromuserid");
NotificationCompat.Builder builder =
new NotificationCompat
.Builder(this, getString(R.string.default_notification_channel_id))
.setSmallIcon(R.drawable.m)
.setContentTitle(messageTitle).setContentText(messageBody);
Intent resultIntent = new Intent(click_action);
resultIntent.putExtra("CompanyPosition", companyposition);
// resultIntent.putExtra("fromuserid",dataFrom);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
//____FOR OREO AND HIGHER VERSIONS_____
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) {
int importance = NotificationManager.IMPORTANCE_HIGH;
String channelID = BuildConfig.APPLICATION_ID;
NotificationChannel channel = new NotificationChannel
(getString(R.string.default_notification_channel_id),
BuildConfig.APPLICATION_ID, importance);
channel.setDescription(channelID);
NotificationManager notificationManager =
getSystemService(NotificationManager.class);
//assert notificationManager != null;
notificationManager.createNotificationChannel(channel);
}
NotificationManager notificationManager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
assert notificationManager != null;
notificationManager.notify(id, builder.build());
}
@Override
public void onNewToken(String s) {
super.onNewToken(s);
FirebaseInstanceId.getInstance().getInstanceId()
.addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult)
{
String newToken = instanceIdResult.getToken();
storeToken(newToken);
}
});
}
private void storeToken(String token) {
SharedPrefManager.getmInstance(getApplicationContext()).storeToken(token);
}}
这是我的登录表单
当您将设备令牌从客户端发送到服务器时,它会标识硬件设备本身,而不是经过身份验证的用户。 这与主题消息类似 - 当您向主题发送消息时,设备决定是否接收这些消息,这与最终用户的登录状态无关。
如果要以用户为目标进行消息传递,而不是以设备为目标,则必须将所有设备令牌的映射存储到用户的 uid。 然后,如果用户想要注销,则必须取消设备令牌与该 UID 的关联,以便他们不再接收消息。
请遵循以下 2 个步骤来有效处理此情况
- 在注销时,进行 api 调用并清除本地服务器中的设备令牌,这样我就不会发送通知。仅根据设备令牌发送通知。
- 当新用户尝试登录到本地服务器中的应用程序标识时,设备令牌是否已经可用。如果可用,则将其设为NULL并插入与新登录用户对应的令牌