代码之家  ›  专栏  ›  技术社区  ›  Guy

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

  •  1
  • Guy  · 技术社区  · 7 年前

    我们允许用户通过我们的react native应用程序进行打卡。

    我们还通过保存操作的地理位置和时间戳并等待活动的internet连接来允许脱机时钟进入。

    有没有办法检测一个聪明的用户在脱机和打卡时是否更改了设备的时间?

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

    5 回复  |  直到 7 年前
        1
  •  1
  •   Albert Renshaw    7 年前

    使用Node.JS可以获取系统的正常运行时间见: https://nodejs.org/api/os.html#os_os_uptime

    剧本是 os.uptime() 并以整数形式返回。如果他们修改了他们的时钟/日期,这个数字仍然会保持正常的滴答声。您可以检查delta,看看它们是否已经更改了时间(注意:时区更改可能仍然是自然发生的)。如果他们重新启动设备,请将当前时间设置为新的基线,并继续从中检查更改。

    它并不能阻止一切(因为一切都是不可预防的),但如果他们能弄清楚你的黑匣子在做什么的话,它确实会让你很难绕过。


    注:

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


    用途:

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

        2
  •  0
  •   codemirror    7 年前

    这有点棘手,而不是主动检查,你可以做一个被动检查欺诈时钟的情况下。

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

    现在如果用户改变了设备时间,或者以后再去!或者过去!你将能够在你的时间记录表中看到波动

    现在,您需要在设备本身或服务器端处理/分析这个timelog_表。

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

        3
  •  0
  •   Itamar    7 年前

    你可以接受艾伯特的回答,再加一个钩子。

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

    有点像 https://stackoverflow.com/a/3367542/2938073

    唯一的障碍是移动操作系统通常限制后台活动。。。

        4
  •  0
  •   Jonas Wilms    7 年前

    如果你只是想得到一个“难以欺诈的时间”:

      var now = +new Date(); // or contact server
    
      setInterval(() => now += 1000, 1000);
    
     // Somewhen:
     console.log(new Date(now));
    
        5
  •  0
  •   Guy    7 年前

    我找到了 following Gist 返回设备启动后的秒数。

    带着这个 NPM module 这是基于我要做的要点:

    1. 服务器响应时: 我节省了服务器时间和操作系统时间
    2. 脱机时用户签入: 保存操作系统标记
    3. 连接已还原: 从ticks diff发送计算日期

    唯一的陷阱是无法检测脱机时重新启动的设备的“真实”时间。然而,我们的项目经理可能只是决定在这种情况下阻止离线签入。