uni-app 中无法用 uni.onaccelerometerchange 获取准确步数,因其仅提供原始加速度数据,不支持系统级计步服务;需通过原生插件调用 healthkit(ios)或 health connect(android 12+)获取精准步数。

uni-app 里不能用 uni.onAccelerometerChange 监听“步数传感器”
加速度计不是步数传感器,它只输出原始三轴加速度值。你调用 uni.startAccelerometer 后拿到的是一堆抖动数据,不是系统级聚合后的“今日步数”。iOS 和 Android 系统本身有独立的计步服务(StepCounter sensor / HealthKit / Health Connect),但 uni.startAccelerometer 根本不访问它们 —— 它连 SENSOR_TYPE_STEP_COUNTER 都不支持。
常见错误现象:
- 同一段走路,不同安卓机型返回步数偏差 ±30%~50%
- 用户静坐晃手机,
onAccelerometerChange触发几十次,被误算成“走了 80 步” - iOS 真机上该 API 常静默不回调,或返回 NaN 值
这不是你算法差,是接口定位错了:它设计用来做体感交互(比如摇一摇),不是健康数据采集。
App 端必须用原生插件调 HealthKit(iOS)或 Health Connect(Android 12+)
系统级精准步数只能从 HealthKit(iOS)或 Health Connect(Android 12+)读取,且必须走原生插件封装。直接写 plus.sensor 或 uni.getWeRunData 在 App 里一定失败 —— 前者没权限,后者根本不存在。
实操要点:
- 插件必须明确标注支持
Health Connect(不是“Google Fit”或“旧版 Android Health”),发布时间在 2025 年底之后 -
manifest.json中 Android 权限缺一不可:android.permission.ACTIVITY_RECOGNITION(Android 10+ 强制)、android.permission.POST_NOTIFICATIONS(Android 12+) - iOS 需在
info.plist补全NSHealthShareUsageDescription和NSHealthUpdateUsageDescription,文案要和 App 审核时填的一致 - 调用前必须检查授权:
health.isAuthorized()→ 未授权则health.requestAuthorization(),且必须由用户真实点击触发(不能自动弹)
示例调用(假设已集成插件 Health-Data):
const health = uni.requireNativePlugin('Health-Data');
health.getStepCount({
startDate: Date.now() - 24 * 60 * 60 * 1000,
endDate: Date.now()
}, (res) => {
console.log('今日步数:', res.steps); // 注意:res.steps 是 number 类型
});
微信小程序只能用 button open-type="getWeRunData",别写 JS 调用
uni.getWeRunData() 在微信小程序里也不能直接 JS 调用。微信强制要求必须由用户点击一个带 open-type="getWeRunData" 的 <button></button> 触发,否则一律报 errCode: -1 或静默失败。
关键限制:
- 必须写在
#ifdef MP-WEIXIN块内,否则 H5/App 编译会出错 - 按钮需配置
scope.werun权限(manifest.json→ 微信小程序 → 权限列表勾选) - 用户首次点击弹授权框;拒绝后再次点击,需在事件 handler 内立即调
uni.openSetting(),不能包在uni.getSetting().then()里 - 前端只拿到
e.detail.encryptedData和e.detail.iv,解密必须交由后端完成(用code换session_key)
模板写法示例:
<button open-type="getWeRunData">同步微信运动</button>
别指望 H5 获取真实步数,浏览器没这个能力
H5 环境下,uni.getWeRunData 报 undefined,plus.sensor 不可用,DeviceMotion 事件只能估算方向、无法推算步数。所谓“H5 读手机步数”,目前没有任何合规、稳定、跨厂商的实现路径。
能做的只有:
- 引导用户跳转到微信小程序(如果已有小程序)
- 在 App 端通过 URL Scheme 唤起已安装的健康类 App(如华为健康、小米运动),但无法回传数据
- 放弃 H5 步数,改用 GPS 轨迹 + 时间估算距离(仅适用于跑步/骑行等强场景)
最常被忽略的一点:即使你在 App 端集成了 Health Connect 插件,只要用户手机系统是 Android 11 或更低、或未开启 Google 帐号同步,getStepCount 就可能返回空数组 —— 这不是 bug,是系统能力缺失。











