Компас True Заголовок в iPhone/iPad

У меня возникла проблема с разработкой компаса iPhone/iPad.

Истинное хождение, взятое из CLHeading, дает мне значение "-1", я застрял здесь. Вот мой код:

self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
self.locationManager.headingFilter = 0.5; //1 degrees
[self.locationManager startUpdatingHeading];

Я также узнал что-то, то есть когда я на карте приложения или компас приложение, которое использует материал местоположения, trueHeading значение внезапно прочитал правильно. Интересно, в чем причина, любая идея? Это происходит как на iPhone4, так и на iPad.

Это также случается, когда я покидаю службы местоположения в настройках и снова включаю его, он становится неспособным прочитать правильное значение trueHeading, интересно, потому что службы определения местоположения не могут быть включены приложением, которое я создаю?

В любом случае, спасибо заранее

--- Мое решение ---

см. ниже.

Ответ 1

--- Мое решение ---

Что я сделал, добавьте в [self.locationManager startUpdatingLocation] до или после [self.locationManager startUpdatingHeading]; (когда службы геолокации отключены и снова активируются из настроек). Я не уверен, что это хорошее решение, но это то, что я сделал, чтобы заставить его работать, если у вас есть лучшее решение, пожалуйста, поделитесь.

Ответ 2

чтобы заголовок не возвращался -1.000000, а не просто запускал startUpdatingHeading, но запускал startUpdatingLocation вместе, это помогает.

Ответ 3

Попробуйте использовать это...

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate=self;
    locationManager.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    // Start heading updates. 
    if (locationManager.headingAvailable && locationManager.locationServicesEnabled) 
    {
        locationManager.headingFilter = kCLHeadingFilterNone; 
        [locationManager startUpdatingHeading];
    }

и после выполнения этого CLLocationManager делегирует методы вызова

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    // Use the true heading if it is valid. 
    [lblAccuracy setText:[NSString stringWithFormat:@"%.1fmi",newHeading.headingAccuracy]]; 
}

Но это кодирование работает на устройстве не в симуляторе...

Счастливое кодирование.

Ответ 4

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

Ответ 5

У меня была такая же проблема. Я переместил startUpdatingHeading в действие кнопки, а затем переместил его обратно туда, где выделен CLLocationManager, где он работал нормально, и он начал возвращать только -1.

Я перезагрузил свой iPad, и он снова начал работать. Надеюсь, это так.

Править: Нет, это не так. Мне тоже пришлось использовать startUpdatingLocation. Не будет ли это изнашивать батарею? Я установил желаемый атрибут kCLLocationAccuracyThreeKilometers, потому что я все равно не использую данные местоположения.

Ответ 6

Истинное чтение требует знания магнитной вариации для места, где вы используете компас. Из предыдущего обсуждения представляется, что функция, которая корректирует истинное направление от магнитного направления, нуждается в вашем местоположении для получения значения вариации. Если вам не нравится использовать информацию о местоположении GPS в вашем коде, я предлагаю прочитать магнитное считывание и исправить значение самостоятельно. Сначала вам нужно получить изменение для желаемого местоположения, а затем применить следующую формулу: T = M ± V, где T - истинное направление, M - магнитное считывание компаса, а V - вариация. Используйте "+" для Востока и "-" для Запада. Я нашел, что разрешающий веб-сайт предоставляет вариацию (магнитное склонение) для любого необходимого местоположения: http://www.geomag.nrcan.gc.ca/calc/mdcal-eng.php.

Ответ 7

Когда службы определения местоположения отключены, didUpdateHeading delegate method возвращает только магнитный заголовок. Вы можете использовать его в соответствии с вашими потребностями. Согласно Apple docs..

Чтобы начать доставку связанных с заголовком событий, назначьте делегата объект диспетчера местоположений и вызвать его метод startUpdatingHeading. Если обновления местоположения также включены, диспетчер местоположений возвращается как истинный заголовок, так и магнитный заголовок. Если обновление местоположения не включены, диспетчер местоположений возвращает только магнитные значение курса.

Ответ 8

Работа над этой проблемой сейчас. Я могу получать обновления от Core Motion, когда я использую SpriteKit. Это о том, что вы можете постоянно вызывать функцию, как только кадр (1/60 секунды) или каждые несколько кадров. Без использования SpriteKit в документации говорится о том, чтобы вызывать обновления в закрытии, которые, как я полагаю, будут в своем потоке и до вас будут выпущены.

Существует алгоритм преобразования показаний магнитометра в фактические градусы относительно истинного севера. Представьте график, который выглядит как функция временного домена переменного тока, и вы увидите, что интерполяция данных - это простой вопрос применения уравнений Максвелла. Вот пример на honeywell