Почему self.locationManager stopUpdatingLocation не останавливает обновление местоположения
Проблема. Кажется, я не могу остановить Core Location
от отправки обновлений моему приложению/отслеживанию.
Что я делаю. В моем viewWillAppear
я вызываю self.locationManager
и передаю его методу, показывающему местоположение пользователя на карте (экземпляр MKMapView
). Геттер переопределяется для проверки доступности серийного номера, чтобы узнать, разрешено ли его использование. Если да, то allocs/inits
и startMonitoringSignificantLocationChanges
и returns
.
В viewDidDisappear
я вызываю [self.locationManager stopUpdatingLocation]
. Но все же я вижу значок местоположения в строке состояния. Даже когда я завершаю приложение, дважды нажав кнопку "домой" и закрыв его, значок все еще там... даже после продолжительного времени (10+ минут). Когда я перехожу в приложение "Настройки", он сообщает мне, что мое приложение по-прежнему использует службы определения местоположения (фиолетовый значок).
Вопрос: Что мне здесь не хватает? Почему обновление местоположения не останавливается?
Спасибо заранее.
Ответы
Ответ 1
Противоположность startMonitoringSignificantLocationChanges
не stopUpdatingLocation
, это stopMonitoringSignificantLocationChanges
.
Вероятно, вы захотите заменить startMonitoringSignificantLocationChanges
на startUpdatingLocation
ради более регулярных обновлений, если у вас нет конкретной причины для мониторинга только для значительных изменений местоположения.
Подробнее о Документация CLLocation.
Ответ 2
Я тоже испытал ту же проблему, что и 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)
}
Ответ 3
Я решил установить этот параметр nil на свойство locationManager после делегирования
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Your code getting coordinates
//Here set nil
locationManager = nil;
}
Ответ 4
Мои приложения запрашивают "всегда" auth. Для этого требуется только определенная функция в приложении. Если пользователь отключит эту функцию, а затем в приложении закрыть, мы можем остановить обновление местоположения (с целью экономии батареи и удаления значка местоположения из строки состояния). Я тоже думал, что остановка не работает, потому что после того, как приложение закрыло значок местоположения в строке состояния, все еще было, хотя мое приложение было единственным приложением на моем телефоне с доступом к местоположению и "на приложении закрыто", я просто сказал ему прекратить обновление местоположений.
Для меня решение было немного более терпеливым, а затем я понял, что требуется iOS около 10-15 секунд, чтобы отключить аппаратное обеспечение местоположения и обновить строку состояния. Мне не нужно было отключать мой менеджер местоположений или что-то особенное, просто остановили обновления на приложении, подождите 15 секунд и наблюдайте, как iOS удаляет значок местоположения из строки состояния. Надеюсь, это поможет кому-то там!
Ответ 5
Я работал с 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
}
Надеюсь, это поможет!
Ответ 6
Swift:
Необходимо остановить остановку вашей карты И менеджера местоположений:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
locationManager.stopMonitoringSignificantLocationChanges()
locationManager.stopUpdatingLocation()
mapView.showsUserLocation = false
}
Вы можете отлаживать/проверять использование служб местоположения прямо в Xcode в навигаторе отладки под воздействием Energy Impact.
Ответ 7
попробуйте это.
if ([CLLocationManager significantLocationChangeMonitoringAvailable])
{
[self.locationManager startMonitoringSignificantLocationChanges];
}
[[self locationManager] stopUpdatingLocation];
Ответ 8
Если вы используете SDK GoogleMaps для iOS, я обнаружил, что если вы вызываете
locationManager.stopUpdatingLocation()
и все еще имеют
mapView.isMyLocationEnabled = true
тогда значок gps останется.
То, что я выбрал, - это сначала показать местоположение пользователя на карте, а затем отключить его через 8 секунд. Это работало для меня с помощью SDK GoogleMaps. Я добавил это в ViewDidLoad:
DispatchQueue.main.asyncAfter(deadline: .now() + 8.0, execute: {
self.locationManager.stopUpdatingLocation()
self.mapView.isMyLocationEnabled = false
})
Вы можете поместить тот же код в viewWillDisappear, если вы предпочитаете не иметь значок gps в строке состояния при переходе к другому представлению.