Firebase Chat设置用户的在线状态

时间:2016-09-25 14:51:42

标签: ios swift firebase firebase-realtime-database

每当用户打开聊天时,我都会尝试添加用户在线状态。

public static func getFirebaseOnlineStatus(userRef: String) -> FIRDatabaseReference{
    return FIRDatabase.database().reference()
            .child("meta")
            .child(userRef)
            .child("last_seen")
}

在ChatVC中

private func userIsOnline() {

    // Firebase make this user online
    firebaseLastSeen = Constants.getFirebaseOnlineStatus(SMBUser.getCurrentUser().getId())
    firebaseLastSeen.setValue("Online")
}

private func observerUserOnline(){
        firebaseLastSeen.observeEventType(.Value, withBlock: { snapshot in
            print(snapshot.value)
            self.userIsOnline()
            }, withCancelBlock: { error in
                print(error.description)
        })
    }

这个逻辑对我来说似乎非常糟糕,因为每次值发生变化时,我都会再次将值更改为Online,因为如果删除observerUserOnline(),则值会更新为Online last_seen但{2}后,即使用户在该聊天中在线,也会更改为time(unix format)

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

您可以使用发布 - 订阅模式。让我们理解什么是发布 - 订阅模式。

  

publish-subscribe是一种消息传递模式,其中包含消息的发送者,   被称为发布者,不要对要直接发送的消息进行编程   特定的接收器,称为订户,而是表征   将消息发布到类中而不知道哪些消息   订阅者,如果有的话,可能会有。同样,订阅者表达   对一个或多个类感兴趣,只接收有关的消息   兴趣,不了解哪些出版商(如果有的话)。

来源:Wikipedia

以下是使用RabbitMQ MQTT Adapter的示例:

将用户A的应用程序订阅到主题“/ topic / user-a”,将用户B的应用程序订阅到主题“/ topic / user-b”,并将在线/离线状态发布到主题" / topic /存在&#34 ;. 在后端服务器上创建一个程序以订阅" / topic / presence"。如果有任何更新来自用户A然后将更新发布给用户A的所有朋友。这样,用户B将收到用户A的在线/离线更新。

                User A             User B            PresenceListener

Subscribe       /topic/user-a      /topic/presence   /topic/presence

Publish         /topic/user-b      /topic/presence   friend list

这里的真正挑战是如何发布"离线"。一个案例是,如果用户在互联网仍处于活动状态时关闭应用程序,则应用程序可以发布"离线"服务器的状态,但当互联网停止工作时会发生什么?

让我们通过"遗嘱和遗嘱#34; (LWT)。

LWT messages are not really concerned about detecting whether a client has gone offline or not (that task is handled by keepAlive messages). LWT messages are about what happens after the client has gone offline.

可以利用LWT消息来定义代理代表客户发布的消息,因为客户端处于脱机状态且无法再发布。

来源:http://tuanpm.net/what-is-mqtt/

对于在状态服务上使用类似内容的示例源代码,您可以查看Github中提供的Applozic Chat SDK代码https://github.com/AppLozic/Applozic-Android-SDK