离线时获取“真实”设备时间的策略

时间:2018-08-05 17:09:38

标签: javascript datetime react-native

我们允许用户通过我们的本机应用程序进行计时。

我们还通过保存操作的GEO位置和时间戳并等待有效的Internet连接来允许离线登录。

有没有一种方法可以检测到一个聪明的用户在离线和计时时是否更改了设备的时间?

我们认为我们可以在应用程序最后一次联系服务器时开始一定的间隔,但这是最好的选择吗?我不确定当应用程序在后台运行时间隔是否会正确运行。

5 个答案:

答案 0 :(得分:1)

使用Node.JS,可以抢占系统的正常运行时间。参见:https://nodejs.org/api/os.html#os_os_uptime

脚本为os.uptime(),并以整数形式返回。如果他们修改时钟/日期,该数字仍将保持正确的滴答状态。您可以检查变化量,以查看它们是否更改了时间(注意:时区更改可能仍然会自然发生)。如果他们重新启动设备,请将其当前时间设置为新的基准,然后从那里继续检查更改。

它不能阻止一切(因为一切都是无法预防的),但前提是假设他们可以弄清楚黑匣子在做什么,那么确实可以绕开它变得更加困难。


注意:

模块:const os = require('os');


防爆用途:

console.log(require('os').uptime())

答案 1 :(得分:0)

这有点棘手,除了主动检查,您还可以对欺诈事件进行被动检查。

您可以运行一个后台任务,该任务每小时或每10分钟获取设备时间并保存在数据库表中(例如timelog_table)。

现在,如果用户更改设备时间并且将来又去了!或过去!您将可以看到timelog_table

的波动

现在由您决定要在设备本身或服务器端处理/分析此timelog_table。

我建议在服务器端执行此操作,但是在这里,您需要将此数据发送到服务器。

答案 2 :(得分:0)

您可以采用Albert的答案并添加另一个钩子。

您可以按时间间隔跟踪时间并查看更改。

类似https://stackoverflow.com/a/3367542/2938073

这里唯一的缺点是移动操作系统通常限制后台活动...

答案 3 :(得分:0)

如果您只是想获得“难以欺诈的时间”:

  var now = +new Date(); // or contact server

  setInterval(() => now += 1000, 1000);

 // Somewhen:
 console.log(new Date(now));

答案 4 :(得分:0)

我发现following Gist返回自设备启动以来的秒数。

使用基于要点的NPM module,我正在执行以下操作:

  1. 根据服务器响应:我节省了服务器时间以及操作系统更新时间
  2. 用户离线时签入:保存操作系统的报价
  3. 连接已恢复:通过滴答差异发送计算出的日期

唯一的陷阱是无法检测离线状态下重新启动的设备的“真实”时间。但是,在这种情况下,我们的PM可能只是决定阻止离线签入。