Подтвердить что ты не робот

Почему self.locationManager stopUpdatingLocation не останавливает обновление местоположения

Проблема. Кажется, я не могу остановить Core Location от отправки обновлений моему приложению/отслеживанию.

Что я делаю. В моем viewWillAppear я вызываю self.locationManager и передаю его методу, показывающему местоположение пользователя на карте (экземпляр MKMapView). Геттер переопределяется для проверки доступности серийного номера, чтобы узнать, разрешено ли его использование. Если да, то allocs/inits и startMonitoringSignificantLocationChanges и returns.

В viewDidDisappear я вызываю [self.locationManager stopUpdatingLocation]. Но все же я вижу значок местоположения в строке состояния. Даже когда я завершаю приложение, дважды нажав кнопку "домой" и закрыв его, значок все еще там... даже после продолжительного времени (10+ минут). Когда я перехожу в приложение "Настройки", он сообщает мне, что мое приложение по-прежнему использует службы определения местоположения (фиолетовый значок).

Вопрос: Что мне здесь не хватает? Почему обновление местоположения не останавливается?

Спасибо заранее.

4b9b3361

Ответ 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 в строке состояния при переходе к другому представлению.