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

Не похоже, что выпущенный сегодня WatchKit включает такой API.


person mobileideafactory.com    schedule 18.11.2014    source источник


Ответы (4)


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

Как всегда, если вам это нужно, отправьте запрос по адресу https://bugreport.apple.com< /а>.

person Dave DeLong    schedule 18.11.2014
comment
Сейчас это устарело, см. Другой ответ casillas для обновления WatchOS 2. - person woody121; 24.06.2015

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

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

Сессия WatchKit для watchOS 2.0 на WWDC 2015

Внедрение пульсометра

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

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

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

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()
    }
}

Код для WatchOS 7.x

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 awake(withContext context: Any?) {
        super.awake(withContext: context)
        motionManager.accelerometerUpdateInterval = 0.1
    }

    override func willActivate() {
        super.willActivate()

        if (motionManager.isAccelerometerAvailable == true) {
            let handler:CMAccelerometerHandler = {data,error 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.startAccelerometerUpdates(to: OperationQueue.current!, 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()
    }
    
}
person casillas    schedule 22.06.2015
comment
Спасибо, что процитировали мой код: github. com/shu223/watchOS-2-Sampler/blob/master/ Буду рад, если вы представите эту ссылку в качестве ссылки :) - person shu223; 13.08.2015
comment
Нет, мы попробовали этот код с ОС часов 2.1, но этот код отображает данные акселерометра сопряженного iPhone. Когда вы двигаете часы, они не отражают и не изменяют никаких данных. Но если вы переместите телефон, он начнет отражаться. - person Nikh1414; 21.12.2015
comment
Я попробовал код акселерометра, и он отлично работает (показывает данные акселерометра Apple Watch)! - person Osmani; 06.04.2016
comment
Вы должны использовать Error вместо NSError. - person Jhonatan S. Souza; 23.05.2020

Обновление для 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()
}
}

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

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

person tech4242    schedule 06.10.2017
comment
@Victor'Chris'Cabral, к сожалению, работает только в режиме тренировки: / def. ограничивает возможные варианты использования (что я узнал на собственном горьком опыте) - person tech4242; 27.05.2018

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

Обновление: Apple предоставила API для разработчиков. Проверьте ответ Касильяса.

person Sebyddd    schedule 18.11.2014
comment
он доступен сейчас, и я поделился кодом и ресурсами ниже. - person casillas; 22.06.2015