3

我们有一个正在开发的 android(或 iphone)客户端。客户端允许 android 用户将条目发送到我们也开发的服务器。如果客户端在用户将条目发送到服务器的那一刻没有数据服务(GPRS),客户端还支持将条目保存到离线数据库并稍后将其发送到服务器。

整个过程的一个重要方面是用户将条目发送到服务器的时间戳的准确性(无论条目是实时生成的还是由客户端从离线数据库发送的)

当客户端可用时,我们获得 GPS 位置,并能够使用 GPS 时间戳将其发送到服务器(或将 GPS 时间戳保存在离线数据库中,稍后再发送到服务器)。但是,如果用户关闭了 GPS(和所有其他定位服务),则设备将没有 GPS 定位,因此服务器无法准确确定何时进行了输入。我们不能使用本地设备时钟,因为用户可能会更改时钟以在与实际发生时间不同的时间进行条目(这些条目是用户工资的一部分,因此他可能有兴趣“修复”它们)。

所以基本上我正在寻找一种方法来尽可能地确定当我不能信任手机的内部时钟时进行某些输入的时间。该算法应该支持实时发送的条目或从离线数据库发送的条目。该算法还应支持用户更改手机时间、打开/关闭手机、在手机上运行应用程序时打开/关闭 GPS 等情况。

我想到的几个想法:

  1. 虽然我不能相信手机的时间,但它仍然可以充当秒表:有一个循环直到应用程序存在的类,循环将休眠 1 秒并将内部时钟变量增加 1 秒。在我的代码获取的每个 GPS 位置上,我们都会更新内部时钟变量。这样我就有了一个来自设备外部(来自 GPS)的绝对时钟,当客户端向服务器发送条目时,我们可以使用内部时钟作为绝对时间。

优点:用户不能修改这个时钟,因为它只有在我们从 GPS 获得位置时才会更新

缺点:应用程序需要至少一个 GPS 定位,然后用户才能进行任何可靠的输入

  1. 我可以利用服务器有一个准确的时钟这一事实。如果客户端将向服务器发送条目的年龄为 10 分钟的信息,则服务器可以使用其内部时间并知道条目的确切时间。

最大的问题是如何知道入职年龄?我考虑将条目保存到年龄为 0 的离线数据库中,然后每 1 秒增加数据库中条目的年龄。问题是,如果应用程序关闭和/或设备关闭,现在会发生这种情况

这是我目前卡住的地方。任何关于如何解决这个问题的想法都非常受欢迎

谢谢

4

3 回答 3

2

我想我会将 Jules 和 Joel 的答案结合到一个解决方案中,这将为我的需求提供最佳解决方案:由于用户可能会在手机没有 GPRS 时更改时钟,因此仅检测时间更改事件对我们没有帮助我们当时无法验证新时间是否正确。

正如 Joel 建议的那样,当我的应用程序启动时,我将从我的服务器中提取时间(此时我仍然必须与服务器进行通信,否则我的应用程序将无法启动)。从服务器提取的时间以及当前设备的 upTime 将被保存。

当用户想要输入时,我将使用 (Server Base Time + Current UpTime - Base UpTime) 计算当前时间。这样,无论设备的当前时钟如何,我都将拥有独立的时间源

这肯定适用于android

在 iPhone 上,我们将尝试使用http://www.cocoadev.com/index.pl?FindingUptime中的内容来获取 upTime

朱尔斯和乔尔,谢谢你的回答!

于 2012-04-30T06:35:28.653 回答
2

这是我为 iPhone 处理此问题的方法。当应用程序启动时,我打电话给我的服务器并询问当前的 GMT 时间(如果你愿意,你也可以调用公共 NTP 服务器)。然后我将它与系统时间进行比较。如果它的差异超过 X,那么我会弹出一条消息,说对不起,您的系统时间错误,因此您在修复此问题之前无法使用该应用程序。然后我监视用户在应用程序运行时更改系统时间,如果他们这样做,然后我再次进行比较(如果时间超过 X,则弹出错误消息)。这可以确保他们的系统时间始终正确(在一些合理的允许范围内)并且您可以信任 [NSDate date]。但是,此解决方案确实需要有效的网络连接。如果此解决方案适合您,我可以发布示例代码。

于 2012-04-29T18:03:05.343 回答
1

查看 android.os.SystemClock。具体来说,elapsedRealtime() 返回手机开机后的时间,如果用户更改时钟,则不会影响该时间。

您可以通过在手机打开时运行代码并检查实时时钟来关联手机关闭时的时间。由于手机关闭时无法更改时钟,我怀疑您可以使用它来构建一个系统,该系统将捕获任何简单的作弊尝试。(如果用户扎根手机,所有的赌注都没有了——他们可以从你下面修改 API 的行为)。

每秒运行代码会缩短手机的电池寿命。如果你这样做,大多数手机都不太可能持续一天。

于 2012-04-29T16:47:36.300 回答