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

7
我希望为所有用户统一显示倒计时计时器。我选择了一种方法,但不确定它是否是最佳选项。
服务器端:
1. Node服务器调用Firebase进行服务器时间戳请求。 2. 服务器将X毫秒添加到时间戳上。 3. 服务器使用新的未来时间戳更新Firebase数据库。
用户端:
1. 接收由服务器创建的未来时间戳。 2. 发送请求到Firebase数据库以接收当前服务器时间戳。 3. 计算服务器时间戳和本地当前时间戳之间的差值。 4. 将在第1阶段接收到的未来时间戳加上计算得出的差值。 5. 显示修正后的剩余倒计时。
我看到这种方法的主要问题是用户可以无限制地读写"timestamp"值。这是否会被用来针对我进行虚假的数据库调用,从而增加我的Firebase使用量(花费我的金钱)?
有没有更好的方法将所有设备同步到未来的统一时间?
1个回答

4

虽然我没有找到完美的解决方案,但有一种方法可以避免每次都需要写入字段。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了解更多信息。
额外说明: 似乎只有在启动连接时才会触发此问题,因此在更改设备时间后,必须重新启动应用程序以获取正确的偏移量。

调用这个 firebaseDatabase 内置函数的使用次数是无限制的吗? - Hammad Ali Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接