iPhone后台模式下的内部时钟

时间:2012-03-05 10:08:11

标签: iphone ios xcode

在我的应用程序中,我想在后台模式下运行内部时钟[当应用程序未在前台运行时]。

整个功能将如下:

目标是让服务器在应用程序中使用时间,因为使用设备时间有时可能会导致问题。问题可能出现在有人改变了用户的iPhone时间等情况。所以我遵循以下方法。

- 即使应用程序未运行,也会在我的应用程序后台运行内部时钟。 - 每15分钟与服务器通信,以获得实时和运行计时器。 - 如果net在两者之间断开连接,定时器将继续并占用定时器时间。

我的申请在很大程度上依赖于这个时间因素,因为这是一个预订系统。请帮我实现这个或者请确认这是否可行?

我正在开发一个涉及票务预订系统的iPhone应用程序。我将我的应用程序注册为基于位置的,因为它正在使用用户在后台拍摄的位置。

我的问题是我需要在后台模式下在我的应用程序中运行内部时钟。我需要在核心位置委托方法中编写内部时钟的代码,这样内部时钟也将与位置服务一起运行。我的应用会被拒绝吗?这样做有什么不对吗?

我需要在我的应用中获得正确的时间,以便我运行此内部时钟。我可以使用NSDate,但这将返回设备时间。任何人都可以更改设备时间。因此,一旦有人唠叨,错误的时间将影响应用程序的顺利运行。有些人建议在没有运行内部时钟的情况下获得正确的时间吗?

5 个答案:

答案 0 :(得分:14)

更新:抱歉说我的原始答案不正确。当设备进入休眠状态(可能在锁定后的某个时间发生),内部CPU时钟停止滴答,mach_absolute_time也不会更新。从理论上讲,如果你在设备进入睡眠状态之前调用它并且在它唤醒之后它将返回完全相同的值。

我知道检查日期更改的最佳方式是kern.boottime,它保留启动时间,只要系统时间发生变化,就会被修改。除其他外,如果用户更改时间,或者操作系统根据来自单元塔的信息更改时间本身,将更新kern.boottime。

因此,在您的情况下,您可以采用您计算的原始时间并根据kern.boottime中的修改进行修改。如果您看到kern.boottime发生了显着变化,则可能意味着该设备已关闭,在这种情况下,您需要联系服务器询问它直到航班的时间。

相关代码:

time_t getBootTimeSecs(void)
{
    struct timeval boottime;    
    size_t size = sizeof(boottime);
    int ret = sysctlbyname("kern.boottime", &boottime, &size, NULL, 0);
    assert(ret == 0);
    return boottime.tv_sec;
}

原始(不正确)答案:您可以使用不受用户日期更改影响的mach_absolute_time

预订机票时,请从服务器获取正确的日期并记录mach_absolute_time。现在,您可以随时拨打mach_absolute_time,计算与您最初记录的差异,并显示正确的日期。

只有在设备没有关闭的情况下,这才有效,在这种情况下,应用程序重新连接到服务器以获取正确的日期是有意义的。

即使应用未运行,您也可以通过本地或推送通知在目标日期越来越近时提醒用户。

答案 1 :(得分:2)

apple支持后台模式的小任务,仅适用于大约10秒。

所以你可以在应用程序处于活动状态时执行一项操作,然后获取时间表格服务器并根据该时间更新当地时间。

答案 2 :(得分:2)

我认为您只能检测到iOs设备的日期已更改(使用NSSystemClockDidChangeNotification)。 我猜您要使用此通知并强制从服务器重新加载应用程序的实际日期(使用WebService)。

编辑:您可以在NSProcessInfo中使用systemUptime:

 NSLog(@"ProcessInfo System uptime: %f",[NSProcessInfo processInfo].systemUptime);

但如果重新启动设备,它将无法解决您的问题。

答案 3 :(得分:1)

我认为有两种方法可以解决您的问题。

  1. 绝不使用系统时间。换句话说,永远不要在代码中调用[NSDate date]。当您需要当前时间时,请致电NTP服务器。这当然会导致您的应用程序延迟,但会保证准确性。

  2. 当应用启动或进入前台时,验证系统时间对NTP服务器是否合理准确。如果系统时间偏差超过您的容差水平,那么在他们解决之前不要让他们继续运行应用程序。如果系统时间正常,则开始监视以确保它们在运行应用程序时不会更改系统时间(NSSystemClockDidChangeNotification)。如果他们通过了初步检查,但是将时钟向前移动,您可以捕捉到并禁用应用程序,直到他们将其更改为准确。

  3. 这是一个iOS NTP实现,可能有助于实现上述任一解决方案。 http://code.google.com/p/ios-ntp/

    编辑:Ticketmaster应用程序使用技术#2,因此对于需要您的系统时间正确的票务应用程序来说,这似乎是一个合理的解决方案。

答案 4 :(得分:1)

  1. 时区设置不应影响UTC中的时间
  2. 您的应用无法在后台运行。滥用此位置要求将导致您的应用被Apple拒绝
  3. 所以我的建议是:使用推送通知执行逻辑服务器端