【问题标题】:Android: How to detect if user changes system time without running a constant service to check timeAndroid:如何检测用户是否更改系统时间而不运行恒定服务来检查时间
【发布时间】:2016-04-07 11:27:23
【问题描述】:

在我的应用程序中,我希望用户能够免费使用它 7 天离线使用,但希望他在 7 天完成后在线连接并在此之后购买订阅。所以基本上,我想在安装 7 天后把他锁在外面。问题是用户可以很好地更改系统时间并欺骗应用程序。此外,我不能使用服务器作为权限,因为该应用程序也应该完全离线工作,除了购买订阅的时间。

我可以运行后台服务来跟踪任何系统时间更改,但我想避免这样做。 是否有直接的解决方案,即使设备完全离线 7 天也可以工作。

【问题讨论】:

  • 该解决方案会起作用,但基本上我不想跟踪设备中发生的所有时间变化。如果设备已植根并且用户从命令行更改或用户在安全模式下更改系统时间,也可能不会收到意图。如果我错了,请纠正我
  • 有根设备没有安全性。时期。不信就看xposed。

标签: android security datetime time


【解决方案1】:

所以这就是我计划解决这个问题的方法,虽然这不是牢不可破的,但对大多数用户都有效。

因此,在签署试用版时,我会获取网络时间并将其作为 start_time 存储在首选项中。接下来在每个应用程序启动和应用程序恢复中,我读取 current_time 并写入首选项。一旦 pref 的 current_time 大于设备的时间,我们就会锁定应用程序。一旦偏好不存在,我们会要求用户按照@Zach 的建议上网

为了让有根设备的人不方便编辑首选项,我将数据以加密形式存储在首选项中。

这仍然不是牢不可破的,因为人们可以反编译 apk 并阅读混淆代码来猜测算法和密钥,但我猜应用程序中的内容价值并没有那么高,以至于有人经历了那么大的痛苦。

【讨论】:

    【解决方案2】:

    使用远程时钟,甚至可以在所需的时间间隔内简单地从手机读取服务器的时间,并将这些数字用作您应用的时钟

    【讨论】:

    • 是的,这是一个很好的解决方案,这是针对这种用例可以做的第一件事。问题是,尽管该应用程序需要离线工作,并且用户只需要在需要购买订阅时才需要上网。因此,用户不连接到互联网是允许的场景
    【解决方案3】:

    您可以将当前时间保存在共享偏好中,并在每次采样时进行比较。如果您获得较旧的样本,则用户会向后更改时间。

    【讨论】:

    • 这是一个糟糕的解决方案。用户可以清除应用程序数据并获得另一个免费 7 天...
    • @vilpe89 如果用户清除应用程序数据,他必须上网(并从服务器获取开始日期)才能继续使用应用程序。对我来说这似乎是个好主意。
    • 我并不是说它是牢不可破的,SharedPreferences 不安全并且可以被操纵。尽管如此,这是一个简单的解决方法,适用于使用无根设备的普通用户。
    • 但是用户可以离线使用该应用程序,然后从哪里获取开始日期,所以这也行不通。并且程序无法检查用户是否清除了数据。
    • 这是一个很好的解决方案。显然在离线情况下没有 100% 的安全保证。所以,需要设置一个7天的注册试用,其中他需要在线,并且需要将帐户信息存储在服务器上,以便同一用户卸载后不会安装。一旦我们获得注册成功,我们将开始时间以某种加密形式存储在首选项中(对于根设备),并且在应用程序的每个 onResume 我们更新最后一个检查点时间,一旦当前时间小于检查点时间,我们锁定应用程序.如果他清除缓存,我们甚至会要求他连接。
    【解决方案4】:

    可以添加系统调用和跟踪离线时间,从here获取

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2015-12-04
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多