我有以下代码:
func OnlineStatus(userID: String){
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
// User is signed in.
self.UID = user.uid
self.connectedRef.observe(.value, with: { snapshot in
if let connected = snapshot.value as? Bool, connected {
// print("############################ Connected")
self.ref.child(self.UID!).child("OnlineStatus").setValue("ON")
} else {
// print("############################ Not connected")
self.ref.child(self.UID!).child("OnlineStatus").setValue("OFF")
}
self.ref.child(self.UID!).child("OnlineStatus").onDisconnectSetValue("OFF")
})
}}
}
该函数将在viewWillAppear中触发。这个想法是建立一个简单的在线状态系统。由于某种原因,当我将应用程序发送到后台,而不是将iPhone发送到睡眠状态时,onDisconnect被触发。我实际上希望仅当用户注销或失去Internet连接时,在线状态才会关闭。我的代码或设置有什么问题?
最佳答案
当客户端与Firebase数据库服务器断开连接时,就会触发onDisconnect
事件,而当您的应用程序进入后台时就会发生。从Firebase的角度来看,在火车上驶入隧道的用户与手机进入睡眠状态之间没有区别。在这两种情况下,客户端和服务器之间的连接都会断开,因此onDisconnect()
会触发。
通常,您最终将使用.info/connected
和onDisconnect()
设置最后一次出现该用户的时间的值,同时使用onAuthStateChanged()
设置正在登录的用户的状态标志。然后,通过首先显示以下用户来显示用户列表:按照他们最近活跃的顺序登录。