基于位置跟踪的iOS全职后台服务

我目前正在编写一个应用程序,这个应用程序依赖于位置跟踪并向服务器发送有关位置的数据。 但问题是,它必须全天候运行,目前我每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秒。

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

您的计时器可能在任务失效后触发(在[UIApplication sharedApplication].backgroundTimeRemaining变为0之后。

事情是,你不能让应用程序在后台不断运行。 如果你想每隔一段时间执行一次代码,你唯一的select就是使用后台定位API,设置你的应用程序在plist中使用位置后台模式。 您将获得CLLocationManagerDelegatecallback,并且在调用这些方法时您有一些时间来做一些工作。

有关背景模式,请参阅Apple文档: 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