Я хочу поддерживать присутствие пользователя в Firestore или Firebase одного устройства с нескольких устройств, которые обращаются к учетным записям одного пользователя

-4

Я хочу поддерживать присутствие пользователей в Firestore или Firebase. Фактически, учетная запись одного пользователя, обрабатываемая несколькими мобильными устройствами и одним планшетом, и планшетом поддерживает или выполняет действия или обеспечивает функциональность по сравнению с моими изменениями данных firestore. поэтому мне нужно поддерживать присутствие планшета в Firestore или Firebase, чтобы другое мобильное устройство понимало работу планшета или нет.

Поэтому, пожалуйста, дайте мне некоторое решение.

Я использую узел Firebase для проверки состояния соединения. код ниже, но я не даю надлежащего ответа, например, когда я onDataChange lan-кабель от маршрутизатора, а затем onDataChange не fire.for разъединения.

final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myConnectionsRef = database.getReference(FirebaseAuth.getInstance().getCurrentUser().getUid()+"/tab/connections");

// stores the timestamp of my last disconnect (the last time I was seen online)
final DatabaseReference lastOnlineRef = database.getReference(FirebaseAuth.getInstance().getCurrentUser().getUid()+"/tab/lastOnline");

final DatabaseReference connectedRef = database.getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
DatabaseReference con = myConnectionsRef.push();

// when this device disconnects, remove it
con.onDisconnect().removeValue();

// when I disconnect, update the last time I was seen online
lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP);

long timestamp = Calendar.getInstance().getTimeInMillis();

// add this device to my connections list
// this value could contain info about the device or a timestamp too
con.setValue(Boolean.TRUE);

}else {

long timestamp2 = Calendar.getInstance().getTimeInMillis();

}
}

@Override
public void onCancelled(DatabaseError error) {
System.err.println("Listener was cancelled at .info/connected");
}
});

спросил(а) 2018-04-05T08:00:00+03:00 2 года, 7 месяцев назад
0
108

Даже если вы используете базу данных Firebase Realtime или новый Cloud Firestore, то, что вы делаете в своем коде, называется отношением 1:1 между пользователем и соединением. Вы ищете пользователя, который может быть подключен с нескольких устройств. Если вы используете флаг, который может содержать значение true или false в зависимости от состояния соединения, у вас возникнет проблема, если пользователь отключится от одного из этих устройств, метод onDisconnect() с этого конкретного устройства вызывается и будет устанавливаться в online на false пока пользователи могут быть подключены к другим устройствам.

На мой взгляд, вы не должны полагаться на соотношение 1:1 между пользователем и их соединением (ами). Пример в официальной документации рассматривает соединения как коллекцию и предполагает, что пользователь подключен до тех пор, пока для этого пользователя остается какой-либо "идентификатор соединения" (сгенерированный методом push()). Я рекомендую вам сделать то же самое, чтобы не допустить трудного отладки условий гонки и проблем с подключением

ответил(а) 2018-04-05T10:19:00+03:00 2 года, 7 месяцев назад
42

Вы можете обновить связанный флаг с идентификатором устройства в базе данных реального времени firebase, после входа в систему.

Таким образом, все другие устройства будут знать о других устройствах.

При выходе из приложения/в приложении Закрыть сделайте этот флаг равным false.

ответил(а) 2018-04-05T10:11:00+03:00 2 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема