使用Firebase服务器时间戳在Android上创建同步倒数计时器

时间:2016-11-21 15:44:25

标签: android firebase firebase-realtime-database

我想显示一个统一给所有用户的倒数计时器。 我选择了一种方法,但我不确定它是否是最好的选择。

服务器端:

  1. 节点服务器使用服务器时间戳请求调用Firebase。
  2. 服务器将X millis添加到时间戳
  3. 服务器使用新的未来时间戳
  4. 更新Firebase数据库

    用户方:

    1. 从db(由服务器创建)
    2. 接收未来的时间戳
    3. 向Firebase数据库发送请求以接收当前服务器时间戳
    4. 计算服务器时间戳与当前时间戳(本地)之间的差值
    5. 将计算的增量添加到第1阶段收到的未来时间戳
    6. 显示已更正的倒计时时间。
    7. 我用这种方法看到的主要问题是用户对" timestamp"有无限制的读/写访问权限。值。这可以用来对我进行伪造的db调用,从而增加我的Firebase使用量(花费我的钱)

      是否有更好的方法将所有设备同步到未来的统一时间?

1 个答案:

答案 0 :(得分: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

附加说明: 这似乎仅在启动连接时触发,因此在更改设备时间后,必须重新启动应用程序才能获得正确的偏移量。