2012-04-29 33 views
3

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

的整个过程的一个重要方面是在其上用户发送的条目到服务器(实时该条目是否是由或从脱机数据库由客户机发送)的时间戳记

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

所以基本上,我正在寻找一种方法来确定我可以做的最好时间,当我不能相信移动设备的内部时钟时进行了一些输入。该算法应支持实时发送的条目或离线数据库发送的条目。该算法还应支持用户更改手机时间,打开/关闭移动电话,在应用程序在移动设备上运行时打开/关闭GPS的情况......

我想到的几个想法的:

  1. 虽然我不能信任移动的时候,它仍然可以执行如秒表: 有一个类,将循环播放,直到应用程序存在,循环会睡1秒,增加内部时钟变量到1秒。在每个GPS位置我的代码得到我们更新内部时钟变量。这样,我有一个绝对时钟来自设备外部(来自GPS),当客户端向服务器发送条目时,我们可以使用内部时钟作为绝对时间。

优点:当我们从GPS得到的位置

缺点,用户不能修改这个时钟,因为它只是更新:应用程序至少需要一个GPS修正前的用户可以拨打任何可靠的条目

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

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

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

由于更多

回答

2

我想我要儒勒和乔尔的回答结合成一个解决方案,这将满足我的需求提供最佳解决方案: 因为用户可能会改变时钟当移动doed没有GPRS,只是检测的时间变化事件不会帮助我们,因为我们现在无法验证新时间是正确的。

由于Joel建议我在我的应用程序启动时(从那时起,我仍然必须与服务器进行通信,否则我的应用程序无法启动)从服务器拉时间。从服务器连同当前设备upTime一起拉出的时间将被保存。

当用户想要进行输入时,我将使用(服务器基准时间+当前正时 - 基准正时)计算当前时间。这样,我将有时间的独立来源,不管设备

这将defenitly在Android

在iPhone上运行的当前时钟,我们将尝试使用出来的东西http://www.cocoadev.com/index.pl?FindingUptime得到正常运行时间

Jules & Joel,谢谢你的回答!

1

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

您可以通过在开机时运行的代码关闭手机并检查实时时钟来关联手机的时间。由于手机关闭时无法更改时钟,因此我怀疑您可以使用此功能将系统组装起来,以便在任何简单的作弊行为中发现。 (如果用户根据电话注销了所有投注,他们可以修改您的API的行为)。

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

2

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

相关问题