在Firebase组消息传递应用程序中实施已读回执功能 [英] Implement a read receipt feature in Firebase group messaging app
问题描述
我想在我的Firebase组消息传递应用程序中实现"Seen"功能.您能否建议最好和最有效的方法(工作代码将不胜感激)?例如,该应用将在群组消息上显示" 6岁的人"或" 15岁的人".
I'd like to implement a 'Seen' feature in my Firebase group messaging app. Can you kindly advise the best and most efficient approach to take (working code will be appreciated)? For example, the app would show "Seen by 6" or "Seen by 15" on a group message.
这是我的项目: https://github.com/firebase/friendlychat/tree /master/android
Here's the MainActivity: https://github.com/firebase/friendlychat/blob/master/android/app/src/main/java/com/google/firebase/codelab/friendlychat/MainActivity.java
推荐答案
要实现此目的,您需要在Firebase数据库中添加名为seenBy
的另一个节点,该节点必须嵌套在meassage
部分中的每个messageId
下.您的数据库应如下所示:
To achieve this, you need to add another node in your Firebase database named seenBy
which must be nested under each messageId
in meassage
section. Your database should look like this:
Firebase-root
|
---- messages
|
---- messageId1
|
---- meessage: "Hello!"
|
---- timestamp: 1498472455940
|
---- seenBy
|
---- userUid1: John
|
---- userUid2: Mary
|
---- userUid3: George
每次新用户打开一条消息时,只需按上述说明添加uid
和name
.
Every time a new user opens a meesage, just add the uid
and the name
as explained above.
要实现Seen by 6
选项,这非常简单.您只需要创建一个listener
并使用getChildrenCount()
这样的方法即可:
To implement Seen by 6
option, it's very easy. You just need to create a listener
and use getChildrenCount()
method like this:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference seenByRef = rootRef.child("messages").child(messageId).child("seenBy");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long seenBy = dataSnapshot.getChildrenCount();
Lod.d("TAG", "Seen by: " + seenBy);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
seenByRef.addListenerForSingleValueEvent(eventListener);
要知道是否已打开消息,您需要在用户部分添加另一个字段,在其中需要添加默认值false
的boolean
.这个新部分应如下所示:
To know whether a message has been opened or not, you need to add another field to your user section in which you need to add a boolean
with the default value of false
. This new section should look like this:
Firebase-root
|
---- users
|
---- userId1
|
---- meessages
|
---- messageId1: false
|
---- messageId2: false
|
---- messageId3: false
当用户打开该消息时,只需将特定消息的值从false
设置为true
,这意味着特定消息已被打开.这是代码:
When a users opens that message, just set the value of that particular message from false
to true
, which means that the particular message has been opened. This is the code:
DatabaseReference openedRef = rootRef.child("users").child(userId).child("meessages").child("messageId1");
openedRef.setValue(true);
创建消息时,请在引用上使用push()
方法,如下所示:
When you create a message, use push()
method on the reference like this:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference messageRef = rootRef.child("meessages").push();
String messageKey = messageRef.getKey();
有了此密钥,您可以在DatabaseReference
中使用它.以同样的方式,您可以将其用于userId.
Having this key, you can use it in your DatabaseReference
. In the same way you can use for the userId.
希望有帮助.
这篇关于在Firebase组消息传递应用程序中实施已读回执功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!