5

我有一个应用程序用于CLLocationManager跟踪用户的路线,沿着所走的路径绘制点。该应用程序使用必需的后台模式在后台运行 > 应用程序注册位置更新。

据我了解,需要调用后台发生的任何事情,locationManager:didUpdateToLocation:fromLocation因为这是每次位置更新都会调用的方法。

我遇到的问题是,有时这会停止被调用。当用户的位置在大约 15 分钟左右的时间内没有太大变化时,似乎会发生这种情况。据我所知,对 locationManager:didUpdateToLocation:fromLocation 的调用刚刚停止,大概是为了节省电池。不幸的是,当您重新开始移动时,它不会再次恢复。

我认为无法覆盖此行为,因此我想使用通知中心通知用户该应用程序不再记录路线。问题是,应用程序如何知道发生了这种情况?如果未调用 locationManager:didUpdateToLocation:fromLocation,我将无法触发通知。如果正在调用它,则不应触发通知。

是否有某种系统通知表明位置更新将停止?

我发现调试它非常困难,因为当我外出并测试设备上的位置时,我无法将我的 Mac 带到任何地方(在模拟器中你只能做这么多)。任何调试技巧也将不胜感激!

4

5 回答 5

8

如果您还没有找到答案,我认为这是因为在CLLocationManagercalled中添加了一个新属性pausesLocationUpdatesAutomatically。该属性默认为YES,其行为与您描述的完全相同。尝试将其设置为NO,我认为它会解决您的问题。

于 2013-02-22T18:41:12.507 回答
4

从 iOS9 开始,请确保您也在位置管理器上设置了此属性:

[locationManager setAllowsBackgroundLocationUpdates:YES]

于 2016-04-05T20:36:21.923 回答
1

有一个位置更新的代表确实失败了

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

有几种错误:kCLErrorDenied kCLErrorNetwork在上面的委托方法中添加代码来处理它们,而不是更新位置,也许是UIAlertView为了告诉用户。

就个人而言,我会调用 [locationManager stopUpdatingLocation];任何错误,然后根据失败的原因使用错误消息重新启动它。

也重新背景,检查您的 appDelegate 中的代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    [self saveContext];
    if ([CLLocationManager significantLocationChangeMonitoringAvailable]) {
        // Stop normal location updates and start significant location change updates for battery efficiency.
        [self.locationHandler.locationManager stopUpdatingLocation];
        [self.locationHandler.locationManager startMonitoringSignificantLocationChanges];
    }
    else {
        NSLog(@"Significant location change monitoring is not available.");
    }
}

最后回复:测试。您可以通过更改模拟器中的位置移动来模拟一些位置错误。例如,从跑步到开车会导致错误。从运行到单个特定的自定义位置会导致错误。它们都应该出现在上面 locationManager 的委托方法中。

于 2013-01-04T15:50:57.080 回答
0

我已经设法通过添加一个本地通知来解决这个问题,每次将新位置添加到路线时都会延迟 90 秒。添加下一个位置时,会取消先前的通知并安排新的通知。这样,如果它停止更新,用户就会收到通知(尽管有 90 秒的延迟)。这并不理想,而且对于电池寿命可能不是很好,但它是一种解决方案,并且是我目前最好的解决方案。

于 2013-01-18T12:18:23.043 回答
0

@Ron,我遇到了与 beev 描述相同的问题,并且我已经将 pausesLocationUpdatesAutomatically 设置为 NO。我认为是因为iOS会在后台杀死一些10分钟内未触发的应用程序。所以现在添加本地通知可能是一个不错的选择。

于 2013-03-27T07:08:03.927 回答