2012-05-22 53 views
4

我目前正在编写一个应用程序,它依赖于位置跟踪并向服务器发送有关位置的数据。但问题是,它必须全天候运行,目前我每2-3天发生一次随机崩溃。我所做的让应用程序在后台运行不断,我将一个NSTimer放在beginBackgroundTaskWithExpirationHandler方法的右边,就是applicationDidEnterBackground方法。计时器执行每分钟并停止/启动位置服务。基于位置跟踪的iOS全职后台服务

Here is a sample crash log

代码基本上看起来像这样:

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秒的超时时间。

我真的没有想法,什么可能是崩溃发生的原因?

+1

https://developer.apple.com/library/IOs/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide /ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html 此链接是多任务和背景资料的文档。它可能持有我们都在寻求的信息。 – Kaili

+1

是的,我做了这个应用程序一次,你可能想要使用NSRunLoopCommonModes你的计时器 –

+1

你看过WWCD 2010会议“在iOS 4中使用核心位置”和相关的示例应用程序“Breadcrumbs”? http://developer.apple.com/videos/wwdc/2010/他们描述了如何在不使用任何计时器技巧的情况下使用核心位置。 – Jenn

回答

4

你的计时器可能发射了AFTER任务无效([UIApplication sharedApplication].backgroundTimeRemaining后到达0

的事情是,你不能使应用程序运行不断在后台。如果你想每隔一段时间执行一次代码,你唯一的选择就是使用后台定位API,设置你的应用在其plist中使用位置背景模式。 你将得到CLLocationManagerDelegate回调,并且你有一段时间做一些w当这些方法被调用时。

见关于后台模式的苹果的文档:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

并且位置awarness手册:http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497