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

时间:2012-02-27 17:54:01

标签: ios mapkit core-location cllocationmanager

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

我在做什么:在viewWillAppear我致电self.locationManager并将其传递给方法以在地图上显示用户的位置({{1}的实例})。重写getter以检查服务器的可用性,以查看是否已授权。如果是,则为MKMapViewallocs/inits以及startMonitoringSignificantLocationChanges

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

问题:我在这里缺少什么?为什么位置更新不会停止?

提前致谢。

9 个答案:

答案 0 :(得分:16)

startMonitoringSignificantLocationChanges的反面不是{​​{1}},而是stopUpdatingLocation

您可能希望将stopMonitoringSignificantLocationChanges替换为startMonitoringSignificantLocationChanges以获得更多定期更新,除非您有特定原因仅监控重要位置更改。

查看CLLocation documentation了解更多详情。

答案 1 :(得分:13)

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

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

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

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

self.mapView.showsUserLocation = YES;

更多代码......

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

    [super viewWillDisappear:animated];
}

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

    (other code)
}

答案 2 :(得分:2)

我在委托

之后将此设置nil解析为locationManager属性
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    // Your code getting coordinates 
    //Here set nil
    locationManager = nil;

}

答案 3 :(得分:1)

我的应用请求“始终”授权。只有应用程序中的某个功能才需要。如果用户关闭该功能,那么在应用关闭时我们可以停止位置更新(目的是节省电池并从状态栏中删除位置图标)。我也认为停止不起作用,因为在应用程序关闭后,状态栏中的位置图标仍然存在,即使我的应用程序是我的手机上运行的唯一应用程序,位置访问和“关闭应用程序”我只是告诉它停止更新位置

对我而言,解决方案是要有点耐心然后我意识到 需要iOS大约10-15秒来关闭位置硬件并更新状态栏 。我没有把我的位置管理员或任何特别的东西弄掉,只是在应用程序关闭时停止更新,等待15秒,并观察到iOS从状态栏中删除位置图标。希望这有助于那里的人!

答案 4 :(得分:1)

我在Swift中使用CLLocationManager并且我认为与Swift或Objective-C相关但是,我刚刚创建了一个布尔值,每当我收到位置更新时我都会更新为true。因为在我的情况下,我只需要在发布时使用一次..例如,

// my boolean to stop location updates
var alreadyUpdatedLocation = Bool()

另外,在我的情况下,我创建了一个辅助函数,每当我得到用户的数据/位置时,我就像这样调用我自己的stopUpdatingLocation

// helper function to stop updates
func stopUpdationgLocation() {

    // since I received my data within a block, I don't want to just return whenever it wants to :)    
    dispatch_async(dispatch_get_main_queue()) {

        // the building stop updating location function call
        self.locationManager.stopUpdatingLocation()

        // my own trick to avoid keep getting updates
        self.alreadyUpdatedLocation = true

    }
}

然后,无论您使用收到的位置更新,都可以执行此操作...

// avoiding multiple calls after I have received user location
if(self.alreadyUpdatedLocation) {
        return
}

我希望它有所帮助!

答案 5 :(得分:1)

<强>夫特:

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

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

    }

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

答案 6 :(得分:0)

试试这个..

    if ([CLLocationManager significantLocationChangeMonitoringAvailable])
            {
                [self.locationManager startMonitoringSignificantLocationChanges];


            }

 [[self locationManager] stopUpdatingLocation];

答案 7 :(得分:0)

如果您使用的是GoogleMaps SDK for iOS,我发现如果您致电

locationManager.stopUpdatingLocation() 

仍然有

mapView.isMyLocationEnabled = true

然后gps图标仍然存在。

我选择做的最初是在地图上显示用户的位置,然后在8秒后将其关闭。这对我使用GoogleMaps SDK很有用。我在ViewDidLoad中添加了这个:

DispatchQueue.main.asyncAfter(deadline: .now() + 8.0, execute: {
            self.locationManager.stopUpdatingLocation()
            self.mapView.isMyLocationEnabled = false
        }) 

如果您希望在转到另一个视图时在状态栏中没有gps图标,则可以在viewWillDisappear中添加相同的代码。

答案 8 :(得分:0)

问题: 就我而言,我同时使用了 startMonitoringSignificantLocationChanges startUpdatingLocation 。 即使通过 locationManager.stopMonitoringSignificantLocationChanges()停止了位置, locationManager.stopUpdatingLocation()。 我的位置不断被打电话。

解决方案:  1.检查您是否使计时器无效。  2.初始化 locationManager.delegate = nil

这些肯定会解决您的问题。