2016-12-04 47 views
1

我想監視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") 

    }) 

回答

1

OnDisconnect告訴服務器採取行動時,客戶端斷開連接。一個用例可以是在線聊天系統

用戶可以看到其他用戶,選擇他們並進行聊天。想象一下,一個結構

connected_status 
    uid_0: true 
    uid_1: true 
    uid_2: false 

所有客戶端觀察connected_status節點,當用戶狀態的變化,他們的UI更新 - 在這種情況下uid_2已斷開所以他們的節點設置爲false。這是通過

child("connected_status).child(myUid).onDisconnectSetValue(false) 

這個函數是獨立於你的應用程序知道它是否連接 - 它只是一個函數的服務器。

要監視您的應用程序連接狀態,觀察火力地堡

".info/connected" 

一個特殊的節點觀察這個節點將讓在它的連接狀態的改變你的應用程序知道。

我們以KVO方式使用它,當.info/connected發生變化時,我們更新一個'isConnected'單身應用程序變量。

在我們的許多觀點中,我們有一個ConnectedImage類,它是一個連接時呈綠色,斷開時呈紅色的圖像。該類KVO的單例是Connected連接變量,並在狀態從false更改爲true時更新爲color,true爲false。這讓用戶知道什麼時候連接或不連接。

爲了完整起見,請查看Firebase文檔Offline Capabilities並向下滾動檢測連接狀態區域。

+0

非常感謝你的幫助,我想我通常能理解你在說什麼 - 但我仍然無法實現它(請參閱上面的問題中添加了更多詳細信息),儘管(我認爲)我是使用Firebase文檔中所述的代碼。 – AJGronevelt

+0

@AJGronevelt你能具體嗎?什麼不起作用?請記住我的答案有兩個部分。 1)服務器在客戶端斷開連接時執行的操作和2)客戶端應用程序在客戶端斷開連接時執行的操作。對於服務器端來說,設計模式是在我的例子中有一個connected_users節點,並且所有客戶端都觀察它。在您的客戶端應用程序中,您必須編寫代碼,如我在我的答案中發佈的代碼,該代碼將uid_x:設置爲false,當它斷開連接時。其他用戶正在觀察該節點,並在節點中的某些內容發生更改並且可以更新其UI時收到通知。 – Jay

+0

謝謝你對我的耐心。我多次閱讀你的答案,每一次都變得更有意義 - 所以我開始理解它的意義,但是與實際代碼糾纏在一起。什麼是不工作的onDisconnect不行動,我沒有辦法讓我在關閉應用程序後將connected_status更改爲「關」,它不會這樣做。我將我的代碼添加到了我原來的問題中,但也使用了這種變化,總是同樣的問題。 – AJGronevelt

相關問題