С помощью CLLocationManager магнитометр может быть задан только для возврата текущего курса устройства.Он может вернуться в нефильтрованном 3d, но нет никаких оснований его использовать - из CLHeading просто используйте свойство trueHeading
.Это даст вам ту же информацию, что и в приложении «Компас».
Чтобы определить направление в Мекку, откуда вы находитесь, вы можете использовать формулы, приведенные здесь .Карты Google дают мне геолокацию около 21.436, 39.832 для Масджида аль-Харама (я не уверен, что это очень точно, поэтому я округлил до неуместно низкого значения), так что вы можете получить ориентир из любого места, CLLocationManager сообщит вамна что-то вроде:
#define toRadians(x) ((x)*M_PI / 180.0)
#define toDegrees(x) ((x)*180.0 / M_PI)
...
double y = sin(toRadians(39.832 - currentLocation.longitude)) * cos(toRadians(21.436));
double x = cos(toRadians(currentLocation.latitude)) * dsin(toRadians(21.436)) -
sin(toRadians(currentLocation.latitude)) * dcos(toRadians(21.436)) * dcos(toRadians(39.832 - currentLocation.longitude));
double bearing = toDegrees(atan2(y, x));
Затем вы можете повернуть указатель на экране по разнице между курсом устройства и тем, который вы только что рассчитали.Вероятно, проще всего использовать CGAffineTransform в свойстве transform UIView.
Все это напечатано, как я отвечаю, кстати, не проверено.Я бы проверил это по достоверному источнику, прежде чем вы зависите от него.