Не похоже, что выпущенный сегодня WatchKit включает такой API.
Есть ли способ получить доступ к акселерометру с Apple Watch?
Ответы (4)
Нет. Прямой доступ к датчикам Apple Watch (включая акселерометр) невозможен.
Как всегда, если вам это нужно, отправьте запрос по адресу https://bugreport.apple.com< /а>.
Информация о данных датчиков теперь доступна в 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()
}
}
Обновление для 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 в отдельной модели и т. д. — чрезвычайно полезно, в мое мнение.
Мы получим его, скорее всего, в следующем году, когда Apple разрешит нам создавать полноценные приложения. До сих пор это только пользовательский интерфейс, взгляды и уведомления.
Обновление: Apple предоставила API для разработчиков. Проверьте ответ Касильяса.