基于位置跟踪的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中使用位置后台模式。 您将获得CLLocationManagerDelegate
callback,并且在调用这些方法时您有一些时间来做一些工作。
有关背景模式,请参阅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