CLLocation- местоположение пользователя потеряно (ноль лат и лонг) при возобновлении работы приложения

Сигнал GPS теряется, когда приложение возобновляется из режима длительного ожидания.
И / или после того, как пользователь входит в здание, где GPS слаб, а затем возобновляет приложение.

Синяя точка исчезает, и карта центрируется по широте:0 в длину:0 (что находится где-то в океане недалеко от Нигерии-Африки). Если в этот момент времени вы запускаете другое приложение GPS, например Apple Maps, вы действительно видите синий точка, даже если не так точно.

Единственный способ, которым пользователь может это исправить - это полностью убить мое приложение и запустить его снова.

Это происходит как на iOS 5.x, так и на iOS 6.x.

Прежде чем углубляться в детали, я бы очень хотел спросить:
Кто-нибудь сталкивался с этой проблемой??
Это очень раздражает, но я не смог найти никого, кто бы жаловался на это в Интернете - очень странно.

Я использую обычную CLLocation с showUserLocation=YES,
Ничего волшебного, никакой специальной настройки точности или чего-то еще, просто простая реализация по умолчанию.

Я уже пытался перезапустить все возможные компоненты, когда приложение возобновляется;

showUserLocation=NO;
showUserLocation=YES;

или же

[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];

или даже освобождение locationManager и его повторная инициализация не помогают!
(также попытался перезапустить его с задержкой, используя dispatch_after)

Есть ли какой-либо программный способ принудительно сбросить сигнал GPS или CLLocation в ios?
Буду признателен за любую актуальную дискуссию!

2 ответа

Решение

Я думаю, что ваше местоположение по умолчанию установлено "Нет", так что этот тип проблемы создан.

Go to 

Edite Scheme..
    |
    |
  "Run YourProjectName"  / Left Hand Side
       |
       |
  Select "Option" Tab
         |
         |
     Default Location
          |
          |
     Choose any Location such like , "London England"

Когда вы говорите, что пытались остановить / запустить CLLocationManager объект, вы говорите, что обратный вызов, который вы получаете в своем делегате, дает вам координату 0,0, или вы пытаетесь получить доступ к местоположению напрямую, используя location недвижимость в CLLocationManager?

Я работаю над приложением, основанным на местоположении, и могу сказать вам одну вещь: вы не можете рассчитывать на непосредственное получение местоположения CLLocationManager объект. Единственный надежный способ получить информацию о местонахождении - это обратный вызов CLLocationManager класс путем реализации

-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

Как я справляюсь CLLocationManager в моем приложении (сейчас я не говорю, что это оптимальный или идеальный вариант для вашего случая использования, но он позволяет нам предоставить пользователю основательный опыт на основе определения местоположения при запуске / возобновлении работы приложения)

  1. Обернуть CLLocationManager в класс управления местоположением (обычно с использованием одиночного) - я думаю, что это может быть подкласс CLLocationManager но в моем случае это просто подкласс NSObject с CLLocationManager объект как собственность
  2. Сохраните последнее известное допустимое местоположение в этом синглтоне, а затем запишите его на диск (NSUserDefaults или другое местоположение - необходимо повторно проверить, разрешено ли сохранять местоположение пользователя в NSUserDefaults но мы сделали это в нашем приложении и, похоже, не влияют на процесс утверждения)
  3. Реализуйте способ получить текущее местоположение в вашем пользовательском классе - в основном проверьте, если CLLocationManager возвращает 0,0, и если это так, верните вместо этого вашу кэшированную позицию
  4. Не обязательно, но если у вас есть несколько видов / страниц, которым нужно использовать местоположение, реализация модели наблюдателя работает хорошо (поскольку ваш синглтон теперь CLLocationManagerделегат, у вас должен быть способ передать эту информацию вашим контроллерам представления).

С учетом вышеизложенного, на моей странице карты (или где бы я ни отображал местоположение пользователя) - я в основном обновляю карту с сохраненным в кэше местоположением один раз (в viewDidLoad), а затем я разрешаю одно обновление карты через делегат-обратный вызов. После того, как обратный вызов получен, я установил showsUserLocation в YES (если обратный вызов не вызывается, значит, у вас еще нет действительного местоположения и поэтому настройка showsUserLocation в этот момент ничего не делает).

Я надеюсь, что это поможет, и не стесняйтесь, дайте мне знать, если у вас есть дополнительные вопросы!

Другие вопросы по тегам