Благоразумное использование диспетчера местоположения
В приведенной строке кода возвращается расстояние между объектами fromLocation и toLocation типа CLLocation. Возвращаемое в результате расчета значение distance обозначает расстояние между двумя точками по дуге большого круга без учета высоты, а это означает, что обе точки считаются находящимися на уровне моря. Как правило, расчета расстояния по дуге большого круга оказывается более чем достаточно, но если в расчете расстояний требуется принять во внимание и высоту над уровнем моря, то для этой цели придется написать свой собственный код.
Если вы не знаете, что означает "расстояние по дуге большого круга", или так называемое "ортодромическое расстояние", вам придется вспомнить из школьного курса географии понятие "ортодромический маршрут". Дело в том, что кратчайшее расстояние между двумя точками на поверхности Земли прокладывается по маршруту, проходящему вокруг всей Земли, т.е. по "большому кругу". При расчете, производимом в классе CLLocation, определяется расстояние между двумя точками по такому маршруту с учетом кривизны поверхности Земли. Без учета этой кривизны получается расстояние между двумя точками по прямой линии, от которого мало проку, по- скольку прямая линия не изменяется и буквально пронизывает саму Землю!
Если подсистема Core Location не в состоянии определить текущее местоположение пользователя, она вызывает метод делегата locationManager:didFailWithError. Наиболее вероятной причиной ошибки, возникающей при определении местоположения, является отказ пользователя в доступе. Пользователь должен разрешить применение диспетчера местоположения, поэтому, когда приложение делает первую попытку определить местоположение пользователя, на экране появляется предупреждение, запрашивающее разрешение для текущей программы на доступ к месту нахождения пользователя.
Если пользователь стукнет по кнопке Dont Allow, делегат будет уведомлен диспетчером местоположения об отказе в доступе с помощью метода locationManager:didFailWith Error:, возвращающего код ошибки kCLErrorDenied. На момент написания этой книги диспетчер местоположения поддерживал только код ошибки kCLErrorLocationUnknown, уведомляющий подсистему Core Location о невозможности определить местоположение, хотя попытки сделать это будут продолжены. Код ошибки kCLErrorDenied, как правило, означает, что приложение не сможет получить доступ к подсистеме Core Location в оставшееся время текущего сеанса связи. С другой стороны, ошибки типа kCLErrorLocationUnknown указывают на затруднение, которое может оказаться временным.
- Дата: 24-01-2015, 21:54