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
в моем приложении (сейчас я не говорю, что это оптимальный или идеальный вариант для вашего случая использования, но он позволяет нам предоставить пользователю основательный опыт на основе определения местоположения при запуске / возобновлении работы приложения)
- Обернуть
CLLocationManager
в класс управления местоположением (обычно с использованием одиночного) - я думаю, что это может быть подклассCLLocationManager
но в моем случае это просто подклассNSObject
сCLLocationManager
объект как собственность - Сохраните последнее известное допустимое местоположение в этом синглтоне, а затем запишите его на диск (NSUserDefaults или другое местоположение - необходимо повторно проверить, разрешено ли сохранять местоположение пользователя в
NSUserDefaults
но мы сделали это в нашем приложении и, похоже, не влияют на процесс утверждения) - Реализуйте способ получить текущее местоположение в вашем пользовательском классе - в основном проверьте, если
CLLocationManager
возвращает 0,0, и если это так, верните вместо этого вашу кэшированную позицию - Не обязательно, но если у вас есть несколько видов / страниц, которым нужно использовать местоположение, реализация модели наблюдателя работает хорошо (поскольку ваш синглтон теперь
CLLocationManager
делегат, у вас должен быть способ передать эту информацию вашим контроллерам представления).
С учетом вышеизложенного, на моей странице карты (или где бы я ни отображал местоположение пользователя) - я в основном обновляю карту с сохраненным в кэше местоположением один раз (в viewDidLoad
), а затем я разрешаю одно обновление карты через делегат-обратный вызов. После того, как обратный вызов получен, я установил showsUserLocation
в YES
(если обратный вызов не вызывается, значит, у вас еще нет действительного местоположения и поэтому настройка showsUserLocation
в этот момент ничего не делает).
Я надеюсь, что это поможет, и не стесняйтесь, дайте мне знать, если у вас есть дополнительные вопросы!