NSTimer应该在iOS 7的后台连续运行

时间:2014-04-08 11:07:14

标签: ios7 nstimer core-location

我正在使用NSTimer,它根据我当前的时间调用startUpdatingLocation或StopUpdatingLocation的方法。如果我当前时间少于晚上8点,它将停止更新位置,但我的计时器将在后台持续运行。我不是删除我的应用程序或在后台删除我的应用程序。

我需要在后台连续运行计时器,并且当第二天当前时间是早上8点时应该开始更新位置。现在我的应用程序在后台运行,但我的位置没有在第二天上午8点开始更新。我在iOS 7中测试过。只有在我从后台启动应用程序后才开始更新位置。

有人可以建议我如何在iOS 7的后台连续运行计时器吗?

 - (void)applicationDidEnterBackground:(UIApplication *)application
      {
            UIDevice *device = [UIDevice currentDevice];
            BOOL backgroundSupported = NO;
            if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
                backgroundSupported = YES;
            }

            if (backgroundSupported) 
            {
                bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask];
                }];


               NSTimer *preventSleepTimer = [[NSTimer alloc] initWithFireDate:[NSDate          dateWithTimeIntervalSinceNow:0] interval:20.0f target:self selector:@selector(switchingOnLocation) userInfo:nil repeats:YES];
            self.mTimer = preventSleepTimer;
            [preventSleepTimer release];

            // Add the timer to the current run loop.
            [[NSRunLoop currentRunLoop] addTimer:self.mTimer forMode:NSRunLoopCommonModes];
        }
    }

2 个答案:

答案 0 :(得分:3)

不可能在后台随意做。您必须遵守Apple的协议。不幸的是,Apple并没有让你在后台运行NSTimers(曾经是iOS 6中的一个漏洞利用程序,但是他们修复了它),而是给你一组指令来实现位置更新。

Apple阅读this article,它彻底解释了如何在后台运行应用程序。

为了您的利益,我建议您在服务器上实施APN服务,并在需要时推送到手机 - 在您的情况下是早上8点。它有它的缺点,但它是我现在能想到的唯一方法。

答案 1 :(得分:1)

   NSTimer *currentCycleTimer;

UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
}];
[currentCycleTimer invalidate];
currentCycleTimer=nil;
secondsLeft = 120;
currentCycleTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(Countdown) userInfo:nil repeats: YES];

-(void) Countdown
{
  [currentCycleTimer invalidate];
   currentCycleTimer=nil;
}