我将用户FCM设备令牌存储在Firebase中。当用户登录时,令牌将被添加到用户的个人资料中,如下所示:
if (FirebaseAuth.getInstance().getCurrentUser()!=null) {
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
DeviceToken token = new DeviceToken(instanceIdResult.getToken());
CollectionReference deviceTokens = mUserCollection.document(mSignedInUserID).collection("device_tokens");
deviceTokens.document(token.getTokenID()).set(token);
}
});
}
这有效。但是,我也想在用户退出时删除该文档。我正在尝试这样做:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
Log.d(TAG,instanceIdResult.getToken());
DocumentReference deactivatedToken = mUserCollection.document(mSignedInUserID).collection("device_tokens").document(instanceIdResult.getToken());
deactivatedToken.delete();
mAuth.signOut();
recreate();
}
});
除实际删除该文档外,所有其他操作都可以使用该方法,并且log语句确认用户的当前ID与要删除的文档标题相匹配。允许对登录用户写入该位置的模拟进行返回。我在做什么错了?
答案 0 :(得分:0)
请注意,使用您的代码,用户将在删除文档之前注销。这是因为delete()
是异步的(以及所有数据库操作),并且在工作完成之前立即返回。如果我不得不猜测,我想说的是,在实际发送删除操作之前,您的身份验证令牌已被清除,并且删除实际上是未经身份验证的用户。因此,您应该做的是等待删除完成才能实际注销用户。使用delete()
返回的任务来知道何时完成。它的工作方式与getInstanceId()
返回的任务相同。