feat(metronome): 升级到 BackgroundAudioManager,iOS 真后台播放
iOS 微信小程序硬限制:
InnerAudioContext 切到后台/锁屏一定被挂起,
即使配置 requiredBackgroundModes 也无效。
唯一支持 iOS 真后台的音频 API 是 BackgroundAudioManager。
新增预合成档位音轨(ffmpeg 拼接 click + click-wood):
- loop_80bpm_2.mp3 慢走 6.0s 4 周期循环 (72 KB)
- loop_110bpm_2.mp3 健走 5.45s 5 周期循环 (66 KB)
- loop_130bpm_2.mp3 快走 5.54s 6 周期循环 (67 KB)
- cover.jpg 200×200 emerald 占位封面 (474B)
新 hook training/hooks/useMetronomeBg.ts:
- 封装 uni.getBackgroundAudioManager() 单例
- 必填 metadata: title/coverImgUrl/singer/epname/webUrl
- onEnded 重赋 src 实现循环 (BgAudio 无原生 loop 属性)
- onPause 同步 isPlaying,用户从锁屏控制条点暂停 UI 自动同步
- 暴露 playLoop(id)/pause/resume/stop API
metronome.vue 改造:
- 切换为 useMetronomeBg,移除右下角微调和拍号选择
(预合成 mp3 改不了 BPM/拍号,要么砍要么扩 9 个 mp3)
- 中央圆按钮逻辑:
· 未选档位 → 默认开"健走"
· 选了档位且在播 → 暂停
· 选了档位且暂停 → 恢复
- 视频 playbackRate 跟当前档位 BPM 同步(80→0.65× / 110→0.89× / 130→1.05×)
- 加底部提示"🔒 锁屏可继续播放,放兜里走也能听到"
- onHide 不 stop,onUnmounted 才 stop(避免锁屏控制条挂死)
副作用:
- 锁屏/通知栏会显示带封面+暂停按钮的音乐控制条(老人友好)
- 切档位有 200~500ms 延迟 (用户主动操作可接受)
- 不再支持任意 BPM 微调 (3 档已覆盖大部分场景)
旧的 useMetronome.ts 暂时保留,如 BgAudio 真机验证 OK 再清理。
Co-authored-by: Cursor <cursoragent@cursor.com>