2016-12-04 10 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は何の効果もないようですが、私が誤解していることは混乱していますか?

-

ジェイの答えの後、私は今(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") 

    }) 

答えて

1

OnDisconnectは、クライアントが切断したときにアクションを実行するサーバーを伝えます。 1つのユースケースはオンラインチャットシステムになります

ユーザーは他のユーザーを見て、選択してチャットできます。そのノードがfalseに設定されているように、この場合のuid_2に切断されました - すべてのクライアントはconnected_statusノードを観察し、ユーザのステータス変更は、そのUIが更新されたときに構造

connected_status 
    uid_0: true 
    uid_1: true 
    uid_2: false 

を想像してみてください。これは、この機能を使うとは無関係です

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

によって行われ、それが接続されていますかどうかを知るかどうかのアプリ - それだけでサーバの機能。

このノードを観察Firebase

".info/connected" 

に特別なノードを観察し、状況を接続アプリを監視するには、それがステータスの変更を接続したとき、あなたのアプリケーションに知らせます。

.info/connectedが変更されたときに、 'isConnected'シングルトンアプリ変数を更新するというKVO形式で使用します。

私たちの多くの見解では、ConnectedImageというクラスがあります。これは、接続されているときは緑色で、切断されているときは赤色の画像です。そのクラスKVOは、シングルトンのisConnected変数であり、状態がfalseからtrue、trueからfalseに変わるたびに色を更新します。これにより、接続されているかどうかをユーザに知らせることができます。

完全性を確認するには、FirebaseのマニュアルOffline Capabilitiesを参照して、接続状態の検出領域をスクロールダウンしてください。私は(と思う)にもかかわらず、私はまだ(追加の詳細は、上記の私の質問に追加を参照してください)、それが仕事を得ることができない -

+0

はあなたの助けをとても感謝し、私は一般的に、あなたが何を言っているか理解して考えますFirebaseのドキュメントに記載されているコードを使用します。 – AJGronevelt

+0

@AJGroneveltあなたは具体的になりますか?何が効いていないのですか?私の答えには2つの部分があることに留意してください。 1)クライアントが切断したときにサーバが何をするか、2)クライアントが切断したときにクライアントアプリケーションが何をするか。サーバ側では、デザインパターンは、私の例のようにconnected_usersノードを持っており、すべてのクライアントがそれを観察することです。 falseに、切断するとします。クライアントアプリケーションでは、私がuid_xを設定し、私の答えは、に掲載のようにコーディングする必要があります。他のユーザーはそのノードを監視しており、ノード内の何かが変更されたときに通知を受け、そのUIを更新できます。 – Jay

+0

私と忍耐していただきありがとうございます。私はあなたの答えを何度も読んで、すべての時間がより理にかなっている - ので、私はあることを意味しています方法を理解し、実際のコードと格闘し始めます。どのような動作していないのは、私はそれは私がアプリを閉じた後に、それはちょうどそれを行うことはありません「オフ」にconnected_statusを変更するために得ることができるだけの方法はありません、onDisconnectが作用しないということです。オリジナルの質問に自分のコードを追加しましたが、そのバリエーションも使用しました。常に同じ問題です。 – AJGronevelt

関連する問題