我想監視Firebase中用戶的在線狀態(即記錄下誰在線),當然我想此聯機狀態在用戶註銷或斷開連接後立即響應/更新。iOS Firebase Swift,在OnDisconnect上使用以監控在線狀態不起作用
我在我的ViewDidLoad的末尾使用了這段代碼,這對於在需要時準確地在線/離線打印時(即,連接丟失或用戶註銷,兩者都是我測試過的)似乎都正常工作。
FIRAuth.auth()?.addStateDidChangeListener() { auth, user in
if user != nil {
print("ONLINE")
databaseRef.child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("OnlineStatus").setValue("ON")
} else {
print("OFFLINE")
}
}
當然,在此打印「離線」,這是爲時已晚改變OnlineStatus的記錄,因爲連接已經丟失。爲了糾正這一點,我把下面的高於這個附加線路:
databaseRef.child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("OnlineStatus").onDisconnectSetValue("OFF")
我的理解是,這將具體是什麼我希望做的,即期望的值更改爲「OFF」只要連接丟失/破壞。但是這個OnDisconnect似乎沒有任何效果,我很困惑我誤解了什麼?
-
繼周杰倫的回答,我現在用這個代碼(這是從火力地堡資料爲準),但它仍然是行不通的。有任何想法嗎?
let myConnectionsRef = databaseRef.child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("OnlineStatus")
let connectedRef = FIRDatabase.database().reference(withPath: ".info/connected")
connectedRef.observe(.value, with: { snapshot in
guard let connected = snapshot.value as? Bool, connected else {
return
}
let con = myConnectionsRef
con.setValue("YES")
// when this device disconnects, remove it
// con.onDisconnectRemoveValue()
con.onDisconnectSetValue("OFF")
})
非常感謝你的幫助,我想我通常能理解你在說什麼 - 但我仍然無法實現它(請參閱上面的問題中添加了更多詳細信息),儘管(我認爲)我是使用Firebase文檔中所述的代碼。 – AJGronevelt
@AJGronevelt你能具體嗎?什麼不起作用?請記住我的答案有兩個部分。 1)服務器在客戶端斷開連接時執行的操作和2)客戶端應用程序在客戶端斷開連接時執行的操作。對於服務器端來說,設計模式是在我的例子中有一個connected_users節點,並且所有客戶端都觀察它。在您的客戶端應用程序中,您必須編寫代碼,如我在我的答案中發佈的代碼,該代碼將uid_x:設置爲false,當它斷開連接時。其他用戶正在觀察該節點,並在節點中的某些內容發生更改並且可以更新其UI時收到通知。 – Jay
謝謝你對我的耐心。我多次閱讀你的答案,每一次都變得更有意義 - 所以我開始理解它的意義,但是與實際代碼糾纏在一起。什麼是不工作的onDisconnect不行動,我沒有辦法讓我在關閉應用程序後將connected_status更改爲「關」,它不會這樣做。我將我的代碼添加到了我原來的問題中,但也使用了這種變化,總是同樣的問題。 – AJGronevelt