2016-11-21 6 views
3

すべてのユーザにカウントダウンタイマーを表示したい。 私はそれを行う方法を選択しますが、最良の選択肢かどうかはわかりません。Firebaseサーバのタイムスタンプを使用してAndroidで同期カウントダウンタイマーを作成する

サーバ側:

  1. ノードサーバーは、サーバーのタイムスタンプ要求にFirebase呼び出し。
  2. サーバ添加Xのミリ秒新しい将来のタイムスタンプと
  3. サーバ更新Firebase DBをタイムスタンプする

ユーザ側:

  1. は、(サーバによって作成された)DBからAA将来のタイムスタンプを受信
  2. 現在のサーバタイムスタンプを受け取るようにFirebase dbにリクエストを送信します。
  3. は、サーバタイムスタンプと現在のタイムスタンプの間のデルタを計算しますamp(ローカル)
  4. ステージ1で受信した将来のタイムスタンプに計算されたデルタを加算します。
  5. は、修正されたカウントダウン時間を左に表示します。

私がこの方法で見られる主な問題は、ユーザーが「タイムスタンプ」値​​に無制限の読み取り/書き込みアクセス権を持つことです。これを使用してdbに対して偽の呼び出しを行うことで、Firebaseの使用量を増やすことができます(私にお金をかけること)

将来的にすべてのデバイスを一斉に同期する方法はありますか?

答えて

0

私は完璧な解決策を見つけられませんでしたが、毎回フィールドに書き込む必要がないようにする方法があります。 Firebaseには組み込みのフィールド/.info/serverTimeOffsetがあり、Firebaseはクライアントとサーバの時間差を考慮したものを含んでいます。

私はこのようなクラスを使用して、サーバーから受信したタイムスタンプをローカルのタイムスタンプに変換して(まともに)同期したカウントダウンを実現しています。

public class ServerTimeSyncer { 

    private static final String TAG = "ServerTimeSyncer"; 

    private DatabaseReference mServerTimeOffsetReference; 
    private long mServerTimeOffset; 

    public long convertServerTimestampToLocal(final long serverTimestamp) { 
     return serverTimestamp - mServerTimeOffset; 
    } 

    public void startServerTimeSync() { 
     if (mServerTimeOffsetReference == null) { 
      mServerTimeOffsetReference = FirebaseDatabase.getInstance().getReference("/.info/serverTimeOffset"); 
      mServerTimeOffsetReference.addValueEventListener(mServerTimeOffsetListener); 
     } 
    } 

    public void stopServerTimeSync() { 
     if (mServerTimeOffsetReference != null) { 
      mServerTimeOffsetReference.removeEventListener(mServerTimeOffsetListener); 
      mServerTimeOffsetReference = null; 
     } 
    } 

    private final ValueEventListener mServerTimeOffsetListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(final DataSnapshot snapshot) { 
      mServerTimeOffset = snapshot.getValue(Long.class); 
      Log.i(TAG, "Server time offset set to: " + mServerTimeOffset); 
     } 

     @Override 
     public void onCancelled(DatabaseError error) { 
      Log.w(TAG, "Server time sync cancelled"); 
     } 
    }; 

} 

は、詳細はhttps://firebase.google.com/docs/database/android/offline-capabilities#clock-skewを参照してください。

その他の注: これは接続の開始時にのみ起動されるため、デバイスの時刻を変更した後に正しいオフセットを取得するためには、アプリを再起動する必要があります。

関連する問題