为什么self.locationManager stopUpdatingLocation不会停止位置更新

Can*_*pus 23 core-location mapkit cllocationmanager ios

问题:我似乎无法停止Core Location向我的应用/跟踪发送更新.

我在做什么:在我的viewWillAppear调用中self.locationManager,将其传递给一个方法,以显示用户在地图上的位置(实例MKMapView).重写getter以检查服务器的可用性,以查看是否已授权.如果是这样,它allocs/initsstartMonitoringSignificantLocationChangesreturns.

viewDidDisappear,我打电话[self.locationManager stopUpdatingLocation].但我仍然可以在状态栏中看到位置图标.即使我通过双击主页按钮并关闭它来终止应用程序,图标仍然存在...即使在延长的时间(10分钟以上)之后.当我转到设置应用程序时,它告诉我我的应用程序仍在使用位置服务(紫色图标).

问题:我在这里错过了什么?为什么位置更新不会停止?

提前致谢.

jni*_*nic 16

相反的startMonitoringSignificantLocationChanges是不stopUpdatingLocation,它是stopMonitoringSignificantLocationChanges.

你可能要替换startMonitoringSignificantLocationChangesstartUpdatingLocation的更多的定期更新的缘故,除非你有只监控显著位置变化的具体原因.

查看CLLocation文档以获取更多详细信息.

  • 我仍然主张为你的场景使用`startUpdatingLocation`,一旦你有一个足够准确的位置,你的`CLLocationManagerDelegate`就会调用`stopUpdatingLocation`. (2认同)
  • 我看到这个答案是正确的.jnic的回复是有效的,但我怀疑我在下面提供的回答是正确的. (2认同)

Chr*_*her 14

我也遇到了与Canopus相同的问题.看来即使调用了stopUpdatingLocation,如果启用了showUserLocation,导航指针仍会驻留在状态栏上.也许这是一个错误?可能是因为我正在运行并使用iOS 4.2.1进行测试,此问题可能已在以后的SDK中修复.

我认为如果调用stopUserLocation,它也会停止显示用户位置,因为我使用它的视图已经消失并随后被释放.

在停止用户位置更新之前,您似乎必须将showUserLocation设置为NO.

无论如何,在我的viewDidLoad方法中,我有以下代码:

self.mapView.showsUserLocation = YES;
Run Code Online (Sandbox Code Playgroud)

更多代码......

- (void)viewWillDisappear:(BOOL)animated
{    
    if (locationManager)
    {
        mapView.showsUserLocation = NO;
        [locationManager stopUpdatingLocation];
    }

    [super viewWillDisappear:animated];
}

- (void)dealloc
{
    if (locationManager)
    {
        [locationManager release];
        locationManager = nil;
    }

    (other code)
}
Run Code Online (Sandbox Code Playgroud)

  • 这是因为stopUpdatingLocation只是告诉LocationManager您的locationManager不再对位置更新感兴趣.mapView有自己的locationManager,当启用showsUserLocation时,它仍在请求位置更新.在没有任何东西等待位置更新之前,GPS硬件不会关闭,因此指示灯保持打开状态. (6认同)

Jua*_*ero 5

迅速:

您的地图位置管理器都需要停止:

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        locationManager.stopMonitoringSignificantLocationChanges()            
        locationManager.stopUpdatingLocation()
        mapView.showsUserLocation = false

    }
Run Code Online (Sandbox Code Playgroud)

您可以在 Xcode 的 Energy Impact 下的调试导航器中调试/检查位置服务的使用情况。