4

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

这是一个示例崩溃日志

代码基本上是这样的:

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 秒。

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

4

1 回答 1

4

您的计时器可能在任务无效后启动(在[UIApplication sharedApplication].backgroundTimeRemaining达到 0.

问题是你不能让应用程序在后台持续运行。如果你想每隔一段时间执行一次代码,你唯一的选择就是使用后台位置 API,设置你的应用在其 plist中使用位置后台模式。您将获得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

于 2012-06-01T19:39:09.103 回答