我正在开发一个必须在后台运行的应用程序。它是一个基于位置的应用程序,所以它一直运行,操作系统不会杀死它。
它应该每10秒发送一些信息(仅用于调试),我在后台设置一个计时器。我在函数中设置一个应该每10秒执行一次的断点,这个断点永远不会被调用,但是如果我暂停应用程序然后继续调用计时器,然后定时器每10秒执行一次没有问题,很奇怪吧? / p>
我认为当我没有调试时,计时器会执行,但事实并非如此,就像我没有暂停调试一样。
我的问题是为什么?计时器设置正确(我假设),因为它在暂停后工作,但事实并非如此。
有什么想法吗?
我设置计时器的方式是:
self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES];
在我连接到web服务的函数中。
感谢。
答案 0 :(得分:20)
我有一个类似的应用程序设计,并坚持同样的事情。我在互联网上找到的是添加这种语句applicationDidEnterBackground:
UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:locationUpdater];
locationUpdater=UIBackgroundTaskInvalid;
} ];
这告诉操作系统你还有事情要做,而不是阻止它。
我的计时器附有此计时器
//this is a wrapper method to fit the required selector signature
- (void)timeIntervalEnded:(NSTimer*)timer {
[self writeToLog:[NSString stringWithFormat:@"Timer Ended On %@",[NSDate date]]];
[self startReadingLocation];
[timer invalidate];
timer=nil;
}
我在我的位置管理器委托方法中设置了计时器。
我感觉到你的痛苦。我发现这些东西都很挑剔。这对我有用。我希望它有所帮助。我发现你在后台可以做的事情没有任何限制。
答案 1 :(得分:0)
您可以在后台执行的操作受到限制。尝试在进入后台之前将计时器添加到运行循环中。即使这样也行不通;您可以在后台运行的唯一代码可能是您注册的核心位置方法调用的代码(例如locationManager:didUpdate...
)。但我的印象是,在您开始进入后台之前已经开始运行的计时器将继续运行。