在viewDidDisappear中,我调用[self.locationManager stopUpdatingLocation]。但是,我仍然可以在状态栏中看到位置图标。即使我通过双击主页按钮并关闭它来终止应用程序,图标仍然存在...即使经过长时间(10分钟以上)。当我打开“设置”应用时,它告诉我我的应用仍在使用位置服务(紫色图标)。
问题:我错过了什么?为什么位置更新不停止?
谢谢。
startMonitoringSignificantLocationChanges
的反义词不是stopUpdatingLocation
,而是stopMonitoringSignificantLocationChanges
。
除非您有特定原因只监测重要位置变化,否则您可能希望将startMonitoringSignificantLocationChanges
替换为startUpdatingLocation
以获得更加规律的更新。
请查看CLLocation文档获取更多详细信息。
startUpdatingLocation
方法,并在你的CLLocationManagerDelegate
中调用stopUpdatingLocation
方法,一旦你获取到了足够准确的位置信息。 - jnic[self.locationManager stopUpdatingHeading];
和 self.locationManager = nil;
对我起了作用。 - EarlySun我也曾经遇到了和Canopus相同的问题。即使调用了stopUpdatingLocation,如果启用了showUserLocation,导航指针仍会留在状态栏上。也许这是一个bug?可能是因为我正在运行和测试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)
}
Swift:
你的地图和位置管理器都需要停止:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
locationManager.stopMonitoringSignificantLocationChanges()
locationManager.stopUpdatingLocation()
mapView.showsUserLocation = false
}
您可以在Xcode中的调试导航器下的能源影响中调试/检查位置服务使用情况。
.UIApplicationDidEnterBackground
)时,我也关闭了showsUserLocation,并在获取.UIApplicationDidBecomeActive
并显示视图(if self.isViewLoaded && (self.view.window != nil)
)时再次打开它。在我的情况下,使用GPS的地图视图与应用程序在前台和后台使用位置管理器进行其他目的是独立的。在设备上,位置“箭头”显示大约10秒后关闭。 - James- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Your code getting coordinates
//Here set nil
locationManager = nil;
}
我在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
}
我希望它有所帮助!
试试这个...
if ([CLLocationManager significantLocationChangeMonitoringAvailable])
{
[self.locationManager startMonitoringSignificantLocationChanges];
}
[[self locationManager] stopUpdatingLocation];
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中。