почему self.locationManager stopUpdatingLocation не останавливает обновление местоположения - PullRequest
23 голосов
/ 27 февраля 2012

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

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

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

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

Заранее спасибо.

Ответы [ 9 ]

16 голосов
/ 27 февраля 2012

Противоположность startMonitoringSignificantLocationChanges - это не stopUpdatingLocation, а stopMonitoringSignificantLocationChanges.

Возможно, вы захотите заменить startMonitoringSignificantLocationChanges на startUpdatingLocation ради более регулярных обновлений, если только у вас нетконкретная причина для мониторинга только для значительных изменений местоположения.

Для получения дополнительной информации см. Документация CLLocation .

13 голосов
/ 08 апреля 2012

Я тоже только что столкнулся с той же проблемой, что и Канопус. Похоже, что даже если вызывается 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)
}
2 голосов
/ 19 января 2015

Я решил эту настройку nil для свойства locationManager после делегата

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    // Your code getting coordinates 
    //Here set nil
    locationManager = nil;

}
1 голос
/ 21 марта 2017

Swift:

Ваша карта И Менеджер местоположений должен быть остановлен:

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        locationManager.stopMonitoringSignificantLocationChanges()            
        locationManager.stopUpdatingLocation()
        mapView.showsUserLocation = false

    }

Вы можете отлаживать / проверять использование сервисов определения местоположения прямо в XCode, в навигаторе отладки под Energy Impact.

1 голос
/ 05 мая 2015

Я работал с 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
}

Надеюсь, это поможет!

1 голос
/ 11 февраля 2015

Мое приложение запрашивает "всегда" авторизацию.Только определенная функция в приложении требует этого.Если пользователь отключает эту функцию, то при закрытии приложения мы можем остановить обновление местоположения (с целью экономии заряда аккумулятора и удаления значка местоположения из строки состояния).Я тоже думал, что остановка не работает, потому что после закрытия приложения значок местоположения в строке состояния все еще был там, хотя мое приложение было единственным приложением, работающим на моем телефоне с доступом к местоположению, и «при закрытии приложения» я просто сказал ему прекратить обновлять местоположения.

Для меня решение было немного терпеливее, и тогда я понял, что iOS требуется около 10-15 секунд, чтобы отключить аппаратное обеспечение местоположения и обновить строку состояния .Мне не пришлось обнулять свой менеджер местоположений или что-то особенное, я просто остановил обновления при закрытии приложения, подождал 15 секунд и заметил, как iOS удаляет значок местоположения из строки состояния.Надеюсь, это кому-нибудь поможет!

0 голосов
/ 25 июля 2018

Задача : В моем случае я использую startMonitoringSignificantLocationChanges и startUpdatingLocation . Даже после остановки местоположения через locationManager.stopMonitoringSignificantLocationChanges () & locationManager.stopUpdatingLocation () . Мое местоположение постоянно вызывается.

Решение : 1. Проверьте, сделали ли вы недействительными таймеры . 2. Инициализируйте locationManager.delegate = nil .

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

0 голосов
/ 17 октября 2017

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

0 голосов
/ 28 октября 2015

попробуйте это ..

    if ([CLLocationManager significantLocationChangeMonitoringAvailable])
            {
                [self.locationManager startMonitoringSignificantLocationChanges];


            }

 [[self locationManager] stopUpdatingLocation];
...