Firebaseの接続が切れたか、回復したかを検出する。

サーバー接続が切れたり回復したりしたことを検出するために、現在のFirebaseの提供するサービスの中で機能するような戦略はありますか?

私は、モバイルデバイスのオフラインの不測の事態を考えており、Firebaseのデータレイヤーがいつ利用可能かを判断する信頼できる手段が欲しいと思っています。

ソリューション

これはよくある要望で、これを可能にするAPIアップデートをリリースしたところです。

var firebaseRef = new Firebase('http://INSTANCE.firebaseio.com');
firebaseRef.child('.info/connected').on('value', function(connectedSnap) {
  if (connectedSnap.val() === true) {
    /* we're connected! */
  } else {
    /* we're disconnected! */
  }
});

完全なドキュメントは https://firebase.google.com/docs/database/web/offline-capabilities で見ることができます。

解説 (8)

更新: プレゼンスに関連する多くの機能では、クライアントがオンラインかオフラインかを知ることは有用です。Firebase Realtime Databaseクライアントは、/.info/connectedに特別な場所を提供し、クライアントの接続状態が変わるたびに更新されます。以下はその例です。

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    boolean connected = snapshot.getValue(Boolean.class);
    if (connected) {
      System.out.println("connected");
    } else {
      System.out.println("not connected");
    }
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});
解説 (3)

ここ数ヶ月で変更になったようですね。現在はこちらの手順です。 https://firebase.google.com/docs/database/web/offline-capabilities

まとめてみると

var presenceRef = firebase.database().ref("disconnectmessage");
// Write a string when this client loses connection
presenceRef.onDisconnect().set("I disconnected!");

となります。

var connectedRef = firebase.database().ref(".info/connected");
connectedRef.on("value", function(snap) {
  if (snap.val() === true) {
    alert("connected");
  } else {
    alert("not connected");
  }
});

私は、参照がどのように設定されるのか、それが何を意味するのか(何もないところから作るのか、それともあらかじめ作っておく必要があるのか)、あるいは、どれがフロントエンドの何かではなく、サーバー上の何かをトリガーするのかについてよく知らないことを認めますが、もしこれを読むときにリンクがまだ最新なら、もう少し読むと役立つかもしれません。

解説 (4)