zvi*_*chu 6 android firebase firebase-realtime-database
我想显示一个统一给所有用户的倒计时器.我选择了一种方法,但我不确定它是否是最好的选择.
服务器端:
用户方:
我用这种方法看到的主要问题是用户对"timestamp"值具有无限的读/写访问权限.这可以用来对我进行伪造的db调用,从而增加我的Firebase使用量(花费我的钱)
是否有更好的方法将所有设备同步到未来的统一时间?
虽然我没有找到完美的解决方案,但有一种方法可以避免每次都需要写入字段。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");
}
};
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅https://firebase.google.com/docs/database/android/offline-capability#clock-skew 。
附加说明:这似乎仅在启动连接时触发,因此更改设备时间后,必须重新启动应用程序才能获得正确的偏移量。
| 归档时间: |
|
| 查看次数: |
1804 次 |
| 最近记录: |