iPhone后台模式下的内部时钟



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

整个功能如下:

目标是获得在应用程序中使用的服务器时间,因为使用设备时间有时可能会导致问题。问题可能发生在某些情况下,比如有人更改了用户的iPhone时间等。所以我遵循以下方法。

-即使应用程序没有运行,也要在应用程序后台运行内部时钟。-每15分钟与服务器通信一次,以获取实时信息并运行计时器。-如果网络在两者之间断开,定时器将继续并占用定时器时间。

我的申请在很大程度上取决于这个时间因素,因为这是一个订票系统。请帮助我实施这一点,或者请确认这是否可能?

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

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

我需要在我的应用程序中获得正确的使用时间,这样我才能运行这个内部时钟。我可以使用NSDate,但这将返回设备时间。任何人都可以更改设备时间。因此,一旦有人懊恼,错误的时间将影响应用程序的顺利运行。请有人建议在内部时钟不工作的情况下获得正确的时间?

更新:很抱歉,我原来的答案不正确。当设备进入睡眠状态时(可能发生在锁定后的某个时间),内部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,计算与最初录制的日期的差异,并显示正确的日期。

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

你也可以选择"本地"或"推送通知",在目标日期越来越近时提醒用户,即使应用程序没有运行。

apple支持后台模式下的小任务,该模式只能工作大约10秒。

所以,当应用程序处于活动状态时,您可以做一件事,然后获取时间表单服务器并根据它更新您的本地时间。

我认为您只能检测到iOs设备的日期已更改(使用NSSystemClockDidChangeNotification)。我想你应该使用这个通知,并强制从服务器上重新加载你的应用程序的真实日期(使用WebService)。

编辑:您可以在NSProcessInfo:中使用系统正常运行时间

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

但如果重新启动设备,它不会解决您的问题。

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

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

  2. 当应用程序启动或进入前台时,根据NTP服务器验证系统时间是否合理准确。如果系统时间超出了您的容忍级别,则在他们解决问题之前,不要让他们继续运行应用程序。如果系统时间正常,则开始监控,以确保他们在运行应用程序时不会更改系统时间(NSSystemClockDidChangeNotification)。如果他们通过了初始检查,但时钟向前移动,你可以捕捉到这一点并禁用应用程序,直到他们将其更改为准确为止。

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

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

  1. 时区设置不应影响UTC中的时间
  2. 你的应用程序无法在后台运行。滥用位置要求会导致你的应用程序被苹果拒绝

所以我的建议是:在逻辑服务器端使用推送通知

最新更新