我正在编写一个应用程序,它依赖于位置跟踪并将有关位置的数据发送到服务器。然而,问题是它必须每周7天,每天24小时运行,目前我遇到每2-3天发生一次的随机崩溃。我在后台不断运行应用程序所做的是将一个NSTimer放在beginBackgroundTaskWithExpirationHandler方法中,右边是applicationDidEnterBackground方法。计时器每分钟执行一次并停止/启动位置服务。
代码基本上如下所示:
UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTaskId = 0;
bgTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1 * 60.0 target: self selector: @selector(onTick) userInfo: nil repeats: YES];
[t fire];
if (bgTaskId != UIBackgroundTaskInvalid){
[app endBackgroundTask: bgTaskId];
bgTaskId = UIBackgroundTaskInvalid;
}
}];
我正在使用 GCDAsyncSockets 进行连接,每次调用的超时时间约为30秒。
我真的没有想法,崩溃发生的原因可能是什么?
答案 0 :(得分:4)
您的计时器可能在任务失效后启动([UIApplication sharedApplication].backgroundTimeRemaining
变为0之后。
问题是无法使应用程序在后台持续运行 。如果您希望每隔一段时间执行一次代码,您唯一的选择就是使用后台位置API,设置您的应用在其plist中使用 location 后台模式。
你会得到CLLocationManagerDelegate
回调,并且你有一段时间在调用这些方法时做一些工作。
请参阅有关背景模式的Apple文档:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html