18

今天发布的 WatchKit 似乎没有包含这样的 API。

4

4 回答 4

26

传感器数据信息现在可Watchkit for watchOS 2.0.

您可以在接下来的 30 分钟演示中查看此信息。如果您不想观看整个会话,则直接跳转到22-28 分钟之间的CoreMotion和功能:HealthKit

WWDC 2015 中用于 watchOS 2.0 会话的 WatchKit

心率实施

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

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()
    }
    
}
于 2015-06-22T16:51:09.683 回答
9

不可以。无法直接访问 Apple Watch 传感器(包括加速度计)。

与往常一样,如果这是您想要的,请在https://bugreport.apple.com提出请求。

于 2014-11-18T20:04:01.183 回答
6

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 分离在一个单独的模型等中 - 在我看来非常有用。

于 2017-10-06T19:37:43.943 回答
2

明年我们很可能会得到它,届时苹果将允许我们构建完整的应用程序。到目前为止,它只是 UI、Glances 和 Notifications。

更新:Apple 现在已经为它提供了开发者 API。检查卡西利亚斯的答案。

于 2014-11-18T20:34:57.007 回答