我正在使用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];
}
}
答案 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;
}