Есть ли способ получить доступ к акселерометру от Apple Watch?

Не похоже, что у WatchKit сегодня есть такой API.

Ответы

Ответ 1

Нет. Прямой доступ к датчикам Apple Watch (включая акселерометр) невозможен.

Как всегда, если это то, что вы хотели бы, пожалуйста, напишите запрос на него https://bugreport.apple.com.

Ответ 2

Информация о данных датчика теперь доступна в Watchkit for watchOS 2.0.

Вы можете проверить эту информацию в следующем сеансе, который представляет собой итоговую 30-минутную презентацию. Если вы не хотите просматривать весь сеанс, вы сразу переходите к функциям CoreMotion и HealthKit, которые находятся между 22-28 мин:

WatchKit для сессии watchOS 2.0 в WWDC 2015

Внедрение частоты сердечных сокращений

https://developer.apple.com/documentation/healthkit/hkworkout

Реализация акселерометра

Вот реализация акселерометра в WatchKit Extension, вот ссылка:

import WatchKit
import Foundation
import CoreMotion

class InterfaceController: WKInterfaceController {


    @IBOutlet weak var labelX: WKInterfaceLabel!
    @IBOutlet weak var labelY: WKInterfaceLabel!
    @IBOutlet weak var labelZ: WKInterfaceLabel!
    let motionManager = CMMotionManager()


    override func awakeWithContext(context: AnyObject?) {
        super.awakeWithContext(context)

        motionManager.accelerometerUpdateInterval = 0.1
    }

    override func willActivate() {
        super.willActivate()

        if (motionManager.accelerometerAvailable == true) {
            let handler:CMAccelerometerHandler = {(data: CMAccelerometerData?, error: NSError?) -> Void in
                self.labelX.setText(String(format: "%.2f", data!.acceleration.x))
                self.labelY.setText(String(format: "%.2f", data!.acceleration.y))
                self.labelZ.setText(String(format: "%.2f", data!.acceleration.z))
            }
            motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: handler)
        }
        else {
            self.labelX.setText("not available")
            self.labelY.setText("not available")
            self.labelZ.setText("not available")
        }
    }

    override func didDeactivate() {
        super.didDeactivate()

        motionManager.stopAccelerometerUpdates()
    }
}

Ответ 3

Мы получим это, скорее всего, в следующем году, когда Apple позволит нам создавать полноценные приложения. До сих пор это только UI, взгляды и уведомления.

Обновить. Apple теперь предоставила API-интерфейсы разработчика. Проверьте ответы кайзеров.

Ответ 4

Обновление для watchOS 4 и iOS 11: Теперь доступны данные гироскопа (скорость вращения), и все данные датчиков из часов можно получить через обновленный CoreMotion.

Более конкретно CMDeviceMotion получает вас:

  • отношение и скорость вращения
  • гравитация и ускорение пользователя.
  • откалиброванное магнитное поле
  • ...

Реализация акселерометра с CMDeviceMotion:

class InterfaceController: WKInterfaceController {

let motionManager = CMMotionManager()

override func awake(withContext context: Any?) {
    super.awake(withContext: context)
    motionManager.deviceMotionUpdateInterval = 0.1
}

override func willActivate() {
    super.willActivate()
    if motionManager.isDeviceMotionAvailable {
        let coreMotionHandler : CMDeviceMotionHandler = {(data: CMDeviceMotion?, error: Error?) -> Void in
            // do something with data!.userAcceleration
            // data!. can be used to access all the other properties mentioned above. Have a look in Xcode for the suggested variables or follow the link to CMDeviceMotion I have provided
        }
        motionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: coreMotionHandler)
    } else {
        //notify user that no data is available
    }
}

override func didDeactivate() {
    super.didDeactivate()
    motionManager.stopDeviceMotionUpdates()
}
}

Примечания по реализации выше:

Хотя этот метод позволит вам получить от A до B с точки зрения получения некоторых данных в реальном времени от Apple Watch, в этом официальный учебник Apple, в котором объясняется, как отделить логику датчика от InterfaceController в отдельной модели и т.д. - чрезвычайно полезно, на мой взгляд.