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

问题 :看来我无法阻止Core Location发送更新到我的应用程序/跟踪。

我在做什么 :在我的viewWillAppear我调用self.locationManager并传递给一个方法来显示用户在地图上的位置( MKMapView一个实例)。 getter被覆盖以检查serive的可用性,看是否授权。 如果是这样,它allocs/inits startMonitoringSignificantLocationChangesstartMonitoringSignificantLocationChangesreturns

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

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

提前致谢。

startMonitoringSignificantLocationChanges不是stopUpdatingLocation ,而是stopMonitoringSignificantLocationChanges

除非您有特定的原因只对重要的位置更改进行监视,否则您可能需要使用startUpdatingLocationreplacestartMonitoringSignificantLocationChangesstartUpdatingLocation更多的定期更新。

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

我也遇到了与Canopus相同的问题。 看来,即使stopUpdatingLocation被调用,如果我已经启用了showUserLocation,导航指针仍然驻留在状态栏上。 也许这是一个错误? 这可能是因为我正在运行并使用iOS 4.2.1进行testing,并且此问题可能已在更高版本的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) } 

在delegate后,我解决了这个设置nil locationManager属性

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { // Your code getting coordinates //Here set nil locationManager = nil; } 

我的应用程序请求“永远”身份validation。 只有应用程序内的某个function需要。 如果用户closures该function,然后closures应用程序,我们可以停止位置更新(目标是节省电池,从状态栏中删除位置图标)。 我也以为停止不工作,因为应用程序closures状态栏中的位置图标后,仍然存在,即使我的应用程序是唯一的应用程序运行在我的手机上的位置访问和“应用程序closures”我刚刚告诉它停止更新位置。

对我来说,解决scheme要有点耐心,然后我意识到需要iOS 10-15秒closures位置硬件并更新状态栏 。 我没有去掉我的位置pipe理器或任何特殊的东西,只是closures了closures应用程序的更新,等了15秒,并观察iOS从状态栏中删除位置图标。 希望这可以帮助那里的人!

我在Swift中使用CLLocationManager ,我认为它与Swift或者Objective-C都有关系,但是我刚刚创build了一个布尔值,只要我收到位置更新就更新为true。 因为在我的情况下,我只需要启动一次。例如,

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

另外,在我的情况下,我创build了一个帮助函数,只要我得到用户的数据/位置,我就像这样调用我自己的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 } 

我希望它有帮助!

迅速:

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

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

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

尝试这个..

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

如果您使用GoogleMaps SDK for iOS,我发现如果您打电话

 locationManager.stopUpdatingLocation() 

仍然有

 mapView.isMyLocationEnabled = true 

那么GPS图标仍然存在。

我select做的是先在地图上显示用户的位置,然后在8秒钟后closures。 这工作对我来说使用GoogleMaps SDK。 我在ViewDidLoad中添加了这个:

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

你可以把相同的代码放在viewWillDisappear中,如果你喜欢在状态栏中没有gps图标,那么当你跳到另一个视图时。