MotionProvider

一个基于 Combine 的 CoreMotion 数据提供器,以 Swift Package 的形式提供。

在每次设备运动数据(加速度计和陀螺仪)更新时,它通过一个结构体

struct MotionData {
    var timestamp : Date
    var acc_x : Double // userAcceleration.x
    var acc_y : Double // userAcceleration.y
    var acc_z : Double // userAcceleration.z
    var rot_x : Double // rotationRate.x
    var rot_y : Double // rotationRate.y
    var rot_z : Double // rotationRate.z
}

通过一个名为 motionWillChangePassthroughSubject<MotionData, Never> 以及一个发布的属性 motion 提供数据。

如果设备上没有真实的地理位置数据(例如,模拟器),它会提供由定时器调度的随机伪运动数据。

用法

启动 Motion Provider

初始化并启动 MotionProvider

let motionProvider = MotionProvider()
motionProvider.start()

处理运动数据

订阅 motionWillChange subject 并存储返回的 Cancellable

cancellableMotion = motionProvider.motionWillChange.sink { md in
    handleMotion(md)
}

sink 闭包中的 handleMotion 函数会在 MotionProvider 发送的每个 MotionData 对象上执行。

此外,MotionProvider 是一个 ObservableObject,它具有一个发布的属性 motion,该属性会更新 ObservableObject。这个动态属性可以直接在 SwiftUI 中访问。

停止 Motion Provider

停止 MotionProvider 并取消订阅

motionProvider.stop()
cancellableMotion?.cancel()