почему самостоятельно.locationManager stopUpdatingLocation не останавливает обновление местоположения
9 ответов
напротив startMonitoringSignificantLocationChanges
не stopUpdatingLocation
, это stopMonitoringSignificantLocationChanges
.
вы, вероятно, хотите заменить startMonitoringSignificantLocationChanges
с startUpdatingLocation
для более регулярных обновлений, если у вас нет конкретной причины для мониторинга только для значительных изменений местоположения.
Проверьте документация CLLocation для более подробной информации.
Я тоже только что испытал ту же проблему, что и Канопус. Похоже, что даже если 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)
}
Я решил этот параметр nil для свойства locationManager после делегата
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Your code getting coordinates
//Here set nil
locationManager = nil;
}
мои запросы приложений" всегда " auth. Только определенная функция в приложении требует этого. Если пользователь выключает эту функцию, то при закрытии приложения мы можем остановить обновления местоположения (с целью экономии заряда батареи и удаления значка местоположения из строки состояния). Я тоже думал, что остановка не работает, потому что после закрытия приложения значок местоположения в строке состояния все еще был там, хотя мое приложение было единственным приложением, работающим на моем телефоне с доступом к местоположению и "на App close" я просто сказал ему остановиться обновление местоположений.
для меня решение было немного более терпеливым, а затем я понял, что iOS требуется около 10-15 секунд, чтобы отключить аппаратное обеспечение местоположения и обновить строку состояния. Мне не нужно было обнулять мой менеджер местоположения или что-то особенное, просто остановил обновления на App close, подождал 15 секунд и наблюдал, как iOS удаляет значок местоположения из строки состояния. Надеюсь, это поможет кому-то там!
я работал с CLLocationManager
в Swift, и я думаю, имеет отношение к 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
}
надеюсь, это поможет!
Свифт:
карта и менеджер местоположения оба должны быть остановлены:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
locationManager.stopMonitoringSignificantLocationChanges()
locationManager.stopUpdatingLocation()
mapView.showsUserLocation = false
}
вы можете отлаживать / проверять использование служб определения местоположения прямо там, в Xcode, в навигаторе отладки под воздействием энергии.
попробуйте это..
if ([CLLocationManager significantLocationChangeMonitoringAvailable])
{
[self.locationManager startMonitoringSignificantLocationChanges];
}
[[self locationManager] stopUpdatingLocation];
Если вы используете GoogleMaps 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, если вы предпочитаете не иметь значок gps в строка состояния при переходе к другому представлению.