Новичок: нужна помощь в доступе к данным магнитометра с использованием Swift

TLDR – Цель: создать простое приложение компаса

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

Однако мне все еще трудно понять, как получить данные магнитометра. Я читал документацию Apple в Obj-C и Swift (поскольку Swift является новым, учебные пособия по компасу почти исключительно выполняются в Obj-C), но они все еще сбивают с толку кого-то, кто так же новичок, как я, когда пытается преобразовать это в быстрое.

Я искал похожие вопросы и даже пытался запустить код из них, и обычно я получаю как минимум 1 ошибку, говорящую о том, что что-то ожидается, отсутствует или не определено. Мешает мне даже протестировать его... Что привело меня к долгому пути, пытаясь понять синтаксис ошибок Xcode.

Я знаю, что должен проверить на своем устройстве, иначе я не увижу никаких данных. Я также знаю, что мне нужно импортировать CoreMotion, затем использовать CMMotionManager как своего рода «шлюз» для извлечения данных, а затем определить интервалы обновления. Но я не понимаю, как структурировать ту часть кода, которая фактически выполняет извлечение данных.

Короче говоря, я просто хочу иметь самый простой способ получения данных и распечатать их, пока я перемещаю свой телефон. Тупые объяснения процесса приветствуются. Обещаю, что не обижусь, а наоборот, буду рад.

У кого-нибудь есть учительское настроение?


person KeeperOfKale    schedule 27.02.2015    source источник


Ответы (2)


Если вы хотите создать простое приложение компаса, я рекомендую вам начать с использования CLLocationManager вместо CMMotionManager. Вы реализуете locationManager(didUpdateHeading:) метод CLLocationManagerDelegate (документы) . Кроме того, вы создаете CLLocationManager (документы ) и начать обновления заголовков, например, в viewDidLoad. Вы можете сделать это, например, в своем контроллере представления, который XCode создает для вас:

class MyViewController: UIViewController, CLLocationManagerDelegate {
     var locationManager: CLLocationManager!

     override func viewDidLoad() {
         super.viewDidLoad()
         locationManager = CLLocationManager()
         locationManager.delegate = self
         locationManager.startHeadingUpdates()
     }


     override func locationManager(_ manager: CLLocationManager!,
                 didUpdateHeading newHeading: CLHeading!) {
          println("New heading \(newHeading.magneticHeading)")
          // TODO: update your UIViews that draw the compass here.             
     }
}

Это поможет вам начать работу, но для реального приложения вам может понадобиться запускать и останавливать обновления заголовков в методах viewWillAppear и viewDidDisappear.

person Teemu Kurppa    schedule 27.02.2015
comment
Я получаю сообщение об ошибке «CLLocationManager» не имеет члена с именем «startHeadingUpdates». - person KeeperOfKale; 28.02.2015
comment
Я использовал startUpdatingHeading. До сих пор я использовал ваш код и не получал ошибок, но также и никаких результатов. Нужен ли интервал обновления? - person KeeperOfKale; 28.02.2015
comment
Я также пытаюсь сделать это и не получаю никаких обновлений. Я также пытаюсь захватить другую информацию о местоположении, и я думал, что это потому, что я пытался сделать и то, и другое. Но я думаю, что нет, учитывая, что это не работает для вас. Теперь я подозреваю, что это как-то связано с калибровкой. - person nroose; 23.03.2015

Вы должны быть уверены, что ваше приложение правильно запросило разрешение, и plist правильно настроен.

фрагмент кода:

    // don't forget iOS 8 wants the plist value too!
    if (locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
        locationManager.requestWhenInUseAuthorization()
    }
person julie m    schedule 23.04.2015