问题:我似乎无法阻止Core Location
向我的应用/跟踪发送更新。
我在做什么:在viewWillAppear
我致电self.locationManager
并将其传递给方法以在地图上显示用户的位置({{1}的实例})。重写getter以检查服务器的可用性,以查看是否已授权。如果是,则为MKMapView
和allocs/inits
以及startMonitoringSignificantLocationChanges
。
在returns
,我致电viewDidDisappear
。但我仍然可以在状态栏中看到位置图标。即使我通过双击主页按钮并关闭它来终止应用程序,图标仍然存在...即使在延长的时间(10分钟以上)之后。当我转到设置应用程序时,它告诉我我的应用程序仍在使用位置服务(紫色图标)。
问题:我在这里缺少什么?为什么位置更新不会停止?
提前致谢。
答案 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 。
这些肯定会解决您的问题。