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


. 2. Инициализировать locationManager.делегат = мь.

Это, безусловно, решит вашу проблему.