从android / iphone到服务器获取准确的时间

时间:2012-04-29 16:44:51

标签: android iphone gps timestamp

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

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

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

所以基本上我正在寻找一种方法来确定最好的时候,当我无法信任移动设备的内部时钟时,我可以进行一些输入。该算法应支持实时发送的条目或脱机DB发送的条目。该算法还应支持用户更改移动时间,打开/关闭移动设备,在移动设备上运行应用程序时打开/关闭GPS的情况......

我想到的几个想法:

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

    缺点:在用户可以进行任何可靠的输入之前,应用程序至少需要一次GPS修复

    1. 我可以利用服务器具有正确的准确时钟这一事实。如果客户端向服务器发送信息表明条目的年龄是10分钟,则服务器可以使用其内部时间并知道输入的确切时间。
    2. 最大的问题是如何知道入职年龄?我考虑将条目保存到年龄为0的脱机数据库,然后每1秒增加数据库中条目的年龄。问题是如果应用程序关闭和/或设备关闭,现在就会发生这种情况

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

      由于

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

当用户想要输入时,我将使用(服务器基准时间+当前上行时间 - 基准上升时间)来计算当前时间。这样,无论设备的当前时钟如何,我都将拥有独立的时间源

这将在android

上有效 在iPhone上

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

Jules&乔尔,谢谢你的回答!

答案 2 :(得分:1)

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

您可以通过在开机时运行代码并检查实时时钟来关闭手机关机时的时间。由于手机关闭时无法更改时钟,我怀疑你可以用它来组合一个能够捕捉任何简单的作弊行为的系统。 (如果用户根据手机所有投注都已关闭 - 他们可以修改您下面的API行为。)

每秒运行代码会终止手机的电池续航时间。如果你这样做,大多数手机都不可能持续一天。