2012-02-27 63 views
19

问题:似乎我不能阻止Core Location发送更新到我的应用程序/跟踪。为什么self.locationManager stopUpdatingLocation不停止位置更新

我在做什么:在我viewWillAppear我称之为self.locationManager,并把它传递给一个方法来显示用户在地图上的位置(的MKMapView一个实例)。 getter被覆盖以检查serive的可用性,以查看它是否被授权。如果是这样,它allocs/initsstartMonitoringSignificantLocationChangesreturns。我的电话是[self.locationManager stopUpdatingLocation]。但是我仍然可以看到状态栏中的位置图标。即使当我通过双击主页按钮并关闭应用程序来终止应用程序时,即使在延长的时间(10分钟以上)之后,图标仍然存在。当我去设置应用程序,它告诉我,我的应用程序仍在使用位置服务(紫色图标)。

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

在此先感谢。

+0

如果你有两个问题(即使它们是相关的),你应该问两个单独的问题。 – benzado 2012-02-27 17:56:30

+0

没问题的第二部分。我拿出来了。我找到了答案。谢谢。 – Canopus 2012-02-27 18:28:52

+0

[Swift版本](http://stackoverflow.com/a/42936517/1634890) – 2017-03-21 19:30:58

回答

15

startMonitoringSignificantLocationChanges的反义词不是stopUpdatingLocation,而是stopMonitoringSignificantLocationChanges

除非您有特定的原因只对重大的位置更改进行监控,否则您可能希望将startMonitoringSignificantLocationChanges替换为startUpdatingLocation以获得更定期的更新。

查看CLLocation documentation了解更多详情。

+0

我试过了。实际上,当我第一次编写代码时,stopMonitoringSignificantLocationChanges,但由于它并没有停止更新,我将其更改为stopUpdatingLocation。我试图在地图上显示某类商家的位置,所以我只需要一次用户的位置。我不需要跟踪它。 – Canopus 2012-02-27 18:20:44

+2

我仍然主张在你的场景中使用'startUpdatingLocation',一旦你的位置有足够的精度满足你的需求,就在你的'CLLocationManagerDelegate'中调用'stopUpdatingLocation'。 – jnic 2012-02-27 18:23:49

+2

我看到这个答案被检查为正确的。 jnic的回复是有效的,但我怀疑我在下面提供的回复是正确的。 – Christopher 2012-04-08 18:12:54

11

我也只是遇到了与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) 
} 
+0

此答案适合我。 – 2012-09-25 15:18:05

+0

这也适用于我! – CainaSouza 2013-01-24 13:46:02

+4

这是因为stopUpdatingLocation只是告诉LocationManager您的locationManager不再对位置更新感兴趣。 mapView有它自己的locationManager,当showUserLocation被启用时,它仍然请求位置更新。 GPS硬件在没有任何等待位置更新的情况下不会关闭,因此指示灯保持点亮状态。 – aranasaurus 2014-02-14 18:10:31

2

我解决了这个设置零到的LocationManager财产委托后

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

} 
+0

这将无法将locationManager设置为零,当我尝试将其值设置为零时,出现类型不匹配错误。 – 2015-09-03 13:33:02

+0

它在Swift 3上完美运行,谢谢! – cubycode 2017-02-08 12:57:08

+0

请显示更多关于locationManager的代码,它是一个变量吗?在文档中哪里说我们应该没有经理? – 2017-03-21 19:37:21

1

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

对我来说,解决办法是更加耐心一点,然后我意识到,需要的iOS约10-15秒至关闭位置的硬件和更新状态栏。我不必删除我的位置管理器或任何特殊的东西,只关闭应用关闭的更新,等待15秒,观察iOS从状态栏中删除位置图标。希望这能帮助那里的人!

+0

请展示一些代码 – 2017-03-21 19:38:38

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 
} 

我希望它能帮助!

+0

保留周期麻烦提前 – 2017-03-21 19:41:22

0

试试这个..

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


      } 

[[self locationManager] stopUpdatingLocation]; 
1

斯威夫特:

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

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

    } 

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

+0

为了我的目的,我还关闭了应用程序进入后台时的showsUserLocation(侦听通知'.UIApplicationDidEnterBackground'),并在获取'.UIApplicationDidBecomeActive'时将其重新打开并且显示视图('如果self.isViewLoaded &&(self.view.window!= nil)')。在我的情况下,使用GPS的地图视图与应用何时在前景和背景中使用位置管理器用于其他目的无关。 在设备上,位置“箭头”表示它在大约10秒后关闭。 – James 2017-04-30 02:04:48

0

如果您使用的是谷歌地图SDK适用于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 
     }) 

你可以把在viewWillDisappear相同的代码,如果你愿意,当你Segue公司另一种观点认为不具有在状态栏上的图标GPS。