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は何の効果もないようですが、私が誤解していることは混乱していますか?
-
ジェイの答えの後、私は今(Firebase文書から取られている)、このコードを使用していますが、それはまだ動作しません。何か案は?
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あなたは具体的になりますか?何が効いていないのですか?私の答えには2つの部分があることに留意してください。 1)クライアントが切断したときにサーバが何をするか、2)クライアントが切断したときにクライアントアプリケーションが何をするか。サーバ側では、デザインパターンは、私の例のようにconnected_usersノードを持っており、すべてのクライアントがそれを観察することです。 falseに、切断するとします。クライアントアプリケーションでは、私がuid_xを設定し、私の答えは、に掲載のようにコーディングする必要があります。他のユーザーはそのノードを監視しており、ノード内の何かが変更されたときに通知を受け、そのUIを更新できます。 – Jay
私と忍耐していただきありがとうございます。私はあなたの答えを何度も読んで、すべての時間がより理にかなっている - ので、私はあることを意味しています方法を理解し、実際のコードと格闘し始めます。どのような動作していないのは、私はそれは私がアプリを閉じた後に、それはちょうどそれを行うことはありません「オフ」にconnected_statusを変更するために得ることができるだけの方法はありません、onDisconnectが作用しないということです。オリジナルの質問に自分のコードを追加しましたが、そのバリエーションも使用しました。常に同じ問題です。 – AJGronevelt