#ios #cllocationmanager #cllocation
#iOS #cllocationmanager #cllocation
Вопрос:
У меня возникла следующая проблема в моем приложении для iPhone:
Я регулярно включаю диспетчер местоположений и жду нескольких обновлений местоположения. При получении нового местоположения я проверяю свойство timestamp нового местоположения, чтобы узнать, является ли это старым местоположением или нет:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
numberOfUpdatesInInterval ;
NSLog(@"%d;%f;%f;%.0f;%@;%@;%@",
numberOfUpdatesInInterval,
newLocation.coordinate.latitude,
newLocation.coordinate.longitude,
newLocation.horizontalAccuracy,
newLocation.timestamp,
[self getCurrentDateAsString],
newLocation);
}
Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я получаю новые местоположения, где временная метка новая, но координаты все еще являются старыми местоположениями, которые я получил ранее. Я тестировал это, когда ехал на своей машине со скоростью 120 км / ч, получая одни и те же координаты несколько раз, но с разными временными метками. У меня такая же проблема в iOS 4 и 5.
Как это возможно? Или как я могу справиться с этой проблемой?
Комментарии:
1. какую точность вы запрашиваете у cllocationmanager?
2. @jackslash: я использую
desiredAccuracy = kCLLocationAccuracyBest
3. Пожалуйста, опубликуйте реализацию
-locationManager:didUpdateToLocation:fromLocation:
.4. получили ли вы ответ на этот вопрос?
5. @HoangPham: Нет, мне все еще не ясно, почему это происходит.
Ответ №1:
Есть несколько способов, которыми iPhone получает свое местоположение.
- сигнал сотовой связи
- точки доступа Wi-Fi
- Спутники GPS
Самый быстрый поиск местоположения — это местоположение сигнала сотовой связи. Пока у вас были данные в последнее время, большинство локальных вышек будут кэшироваться. Точность вышки сотовой связи может варьироваться от 500 м до 1500 м и более.
Вторым по скорости, при условии, что у вас есть подключение к данным или вы недавно были в этом районе, является поиск по Wi-Fi. Это обеспечит очень точное местоположение. Предостережение заключается в том, что вы должны находиться рядом с Wi-Fi и иметь хороший сигнал передачи данных.
Самый медленный — GPS. GPS в iPhone — это aGPS. Он использует данные из местоположений вышек сотовой связи, чтобы лучше определить ваше местоположение. Если у телефона нет подключения для передачи данных и он не находится рядом с Wi-Fi, исправление может занять от 2 до 4 минут. С информацией о вышке сотовой связи это может занять 30 секунд.
Из документов Apple:
При запросе высокоточных данных о местоположении первоначальное событие, доставленное службой определения местоположения, может не соответствовать точности, которую вы просили. Служба определения местоположения доставляет начальное событие как можно быстрее. Затем он продолжает определять местоположение с запрошенной вами точностью и при необходимости предоставляет дополнительные события, когда эти данные доступны.
В автомобиле будет меньше вероятности, что вы находитесь рядом с точками Wi-Fi, и, возможно, вам придется дольше ждать включения GPS. Если LocationManager считает, что вы все еще находитесь в зоне действия предыдущего местоположения, это может привести к старой координате с другой временной меткой.
Проверьте горизонтальную точность данных, а также временную метку, чтобы определить, является ли местоположение таким точным, как вы просили.
Комментарии:
1. Я даже получаю эту проблему с очень хорошей точностью по горизонтали (т. Е. 47,42 м). Единственная проблема заключается в том, что местоположение старое, но временная метка изменилась. Я понимаю, что он кэшируется, но тогда я бы ожидал, что временная метка будет временной меткой с момента, когда местоположение было захвачено ранее, а не обновленным (более поздним). Таким образом, я не могу определить, не переместился ли я или не получил более старое кэшированное местоположение.
2. Если горизонтальная точность допустима и мала, а временная метка новая, похоже, это может быть ошибка. Если у вас остался инцидент с технической поддержкой в вашей программе, вы можете поднять его.
Ответ №2:
Диспетчер местоположений по умолчанию обновляет местоположение как
LocationManager.distanceFilter = kCLDistanceFilterNone;
именно поэтому вы получаете повторяющиеся координаты. на самом деле он очень часто обновляет детали, даже когда происходит изменение ВЫСОТЫ.
Поэтому лучше всего установить
locationManager.distanceFilter = 4.0f;
// это отправит новые сведения об обновлении местоположения только при перемещении каждые 4 метра от вашего текущего местоположения.
Комментарии:
1. Я также исправил это с помощью комбинированного использования временной метки, фильтра горизонтальной частоты и расстояния ….. Приветствия 🙂
2. Я прекратил работу над этим проектом с апреля 2014 года. Прошло уже 3 года. Итак, я не знаю, в чем дело сейчас. Хорошо, что вы нашли решение.