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

iOS 7-后台位置应用程序在获取后台位置时被杀死,ios,core-location,cllocationmanager,Ios,Core Location,Cllocationmanager,我已经检查了以前关于这个问题的stackoverflow,没有得到正确的答案。我有CLLocationManager设置,可以在后台进行区域监视和位置更新。我已启用应用程序的功能,以进行后台位置更新。。然而,我看到,当我得到位置更新时,我在做一些处理时会被杀死。。i、 e.获取位置并将其发送到服务器。。你知道为什么会这样吗。。我已经为所有应用程序代表添加了日志消息,但我也没有看到他们中的任何人被解雇。。任何指点都将不胜感激 对于以下第1项,您是否建议: - (void) _processNewL

我已经检查了以前关于这个问题的stackoverflow,没有得到正确的答案。我有CLLocationManager设置,可以在后台进行区域监视和位置更新。我已启用应用程序的功能,以进行后台位置更新。。然而,我看到,当我得到位置更新时,我在做一些处理时会被杀死。。i、 e.获取位置并将其发送到服务器。。你知道为什么会这样吗。。我已经为所有应用程序代表添加了日志消息,但我也没有看到他们中的任何人被解雇。。任何指点都将不胜感激

对于以下第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) 当您使用后台位置时,它应该是多余的,不需要,但是我发现,如果您在使用位置时没有获得预期的执行行为,那么在调用updateLocations:gets时,使用beginBackgroundTaskWithExpirationHandler有时可以修复类似的问题

2) 您可以尝试的另一件事是将pausesLocationUpdatesAutomatically设置为NO,以查看它是否为您解决了问题,但如果它解决了问题,则可能需要更多的电池

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

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

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


“外景地”有时会发生一些神秘而怪异的事情。

我们可以聘请你来为这个话题提供咨询吗?@otmezger我在linkedin上给你打过电话。