【问题标题】:Strategy for getting a "real" device time while offline离线时获得“真实”设备时间的策略
【发布时间】:2018-08-07 13:59:58
【问题描述】:

我们允许用户通过我们的 react 原生应用打卡。

我们还允许离线打卡,方法是保存操作的 GEO 位置和时间戳并等待活动的互联网连接。

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

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

【问题讨论】:

  • 如果有人真的想欺骗你,他将能够解决所有对策。
  • @JonasW。我认为这是正确的,但我们的目标是找到一种方法来防止普通用户而不是斯诺登左右发生这种情况......;-)

标签: javascript datetime react-native


【解决方案1】:

这有点棘手,您可以对欺诈打卡案例进行被动检查,而不是主动检查。

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

现在,如果用户更改了设备时间并且将来会继续!或过去!您将能够看到 timelog_table 的波动

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

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

【讨论】:

  • 如果您有任何问题/疑问,请询问我。
  • 整张表都不需要,他可以在应用程序启动时存储process.uptime()并检查增量
  • 是的,这对我来说很清楚,听起来很可靠。我会试一试的。
  • 最终使用了 OS ticks 方法,因为它不需要后台任务。我探索的关于在 RN 中使用后台任务的存储库提到它不能保证任务会被触发,因此我决定寻找一种不同的方法。后台任务仓库:github.com/jamesisaac/react-native-background-task
【解决方案2】:

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

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

它并不能阻止所有事情(因为所有事情都无法预防),但确实会让绕过它变得更加困难,假设他们可以弄清楚你的黑匣子在做什么。


注意:

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


前用法:

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

【讨论】:

  • 你熟悉 React Native 中的正常运行时间方法吗?了解这种 NodeJS 方法很好,但是,我们试图解决的场景是应用程序位于月球的较暗面,也就是服务器无法触及的地方
  • @Guy 据我所知,这应该可以离线工作吗?我可能会遗漏一些东西;我对反应式本机并不完全熟悉,但我的印象是 Node.JS 可以在离线时使用它运行。如果没有,希望其他人可以帮助你,祝你好运!
  • 谢谢,我试了一下,但 os 模块是 NodeJS 的一部分,而不是 React Native 的一部分。有人写了一篇关于在 React Native 中使用核心 nodeJS 模块的过程的博客文章:hackernoon.com/…。但是,它需要一个转译过程,该过程可能仅适用于依赖较少的模块和非设备特定的模块(例如加密)。非常感谢。
【解决方案3】:

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

有了这个基于 Gist 的 NPM module,我正在做以下事情:

  1. 在服务器响应时:我将服务器时间与操作系统的滴答声一起保存
  2. 用户在离线时签到:保存操作系统滴答声
  3. 连接已恢复:根据刻度差异发送计算出的日期

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

    • 是的,后台活动似乎是关键。如果 RN 中有一些与设备的日期和时间无关的内部滴答计数器,那肯定会节省一天的时间(对我们来说...... ;-))
    【解决方案5】:

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

      var now = +new Date(); // or contact server
    
      setInterval(() => now += 1000, 1000);
    
     // Somewhen:
     console.log(new Date(now));
    

    【讨论】:

    • 是的,所以我想知道您是否有在应用程序处于后台时在 React Native 中运行间隔的经验。他们还在玩吗?
    • @guy 不,它们不会在后台运行,但很快就会出现谷歌 github.com/jamesisaac/react-native-background-task/blob/master/…
    • @guy,我很抱歉我的回答,应该在回答之前再次阅读问题......:/
    • 不用担心!欣赏答案并查看 react-native-background-task。它看起来可以适应增量任务,文档说最小间隔时间是 15 分钟,它仍然可以充当离线计时。有两件事似乎使它更难使用 - 不能保证 15 分钟的事实,并且根据操作系统对后台进程的黑盒处理可能会丢弃一些滴答声。然而,它似乎是一个有用的库,我可能很快就会使用它
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多