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

时间:2012-05-22 16:36:16

标签: ios cocoa-touch networking background

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

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 个答案:

答案 0 :(得分:4)

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

问题是无法使应用程序在后台持续运行 。如果您希望每隔一段时间执行一次代码,您唯一的选择就是使用后台位置API,设置您的应用在其plist中使用 location 后台模式。 你会得到CLLocationManagerDelegate回调,并且你有一段时间在调用这些方法时做一些工作。

请参阅有关背景模式的Apple文档:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

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