iOS 7 - 后台位置应用程序在获取后台位置时被杀死

时间:2014-04-12 20:39:18

标签: ios core-location cllocationmanager

我已经检查了有关此问题的先前stackoverflow并且没有得到正确的答案。我有CLLocationManager设置与区域监控并在后台获取位置更新。我已经启用应用程序的功能为Backgroud位置更新..但是我看到,当我得到位置更新时,我被杀死,当我做一些处理..即获取位置并将其发送到服务器..任何想法为什么会发生这种情况..我已经为所有应用代表添加了日志消息,我也没有看到他们中的任何一个被解雇..任何指针都将受到赞赏..

对于下面的#1,您建议:

- (void) _processNewLocationFromManager:manager

{
    // Process
}
- (void)locationManagerUpdatedLocation:(CSLocationManager *)manager
{
    BOOL isBackground = [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground;
    if (!isBackground || (isBackground && self.bgTask == UIBackgroundTaskInvalid)) {
        if (isBackground ) {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                [self beginBackgroundUpdateTask];
                [self _processNewLocationFromManager:manager];
                [self endBackgroundUpdateTask];
            });
        } else {
            [self _processNewLocationFromManager:manager];
        }
    }
}

- (void) beginBackgroundUpdateTask
{
    self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void) endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.bgTask];
    self.bgTask = UIBackgroundTaskInvalid;
}

1 个答案:

答案 0 :(得分:0)

1)当你使用后台位置时,它应该是多余的而且不需要,但是我发现你在使用location时没有得到你期望的执行行为然后在updateLocations:被调用时抛出beginBackgroundTaskWithExpirationHandler有时会修复像这样的问题。

2)你可以尝试的另一件事是将pausesLocationUpdatesAutomatically设置为NO以查看它是否为你修复了一些东西,但如果确实如此,它可以再使用电池。

3)另外要尝试的另一件事是,如果你有其他背景模式与位置同时设置(特别是backgroundFetch和remoteNotifications),你可以尝试暂时关闭它们以查看它是否有不良影响。

4)最后一件事,看看手机上是否安装了其他基于位置的应用程序当前正在运行,根据我的经验,我发现如果有多个位置应用程序正在运行并且他们有不同的位置管理器设置集然后一个应用程序可以影响另一个应用程序的行为。

这些都不会对您的程序产生任何影响,而且可能不会。读这篇文章的人可能认为这些建议很疯狂,而且不应该工作。但是在过去的几个月里我经历了几个不同的位置应用程序并且经过许多很多调试会话,记录会话,观察位置应用程序在后台运行时的行为,我得出了明确的结论,并且我100%确信一切都不像它看起来和应该是的那样(也没有记录,也不应该根据累积的群体智慧和堆栈溢出答案)当谈到位置行为时。

有时会在位置上发生一些神秘而棘手的事情。