From c1dfb01f53515081ecfad472024f29b3a9514a3f Mon Sep 17 00:00:00 2001 From: long <452591453@qq.com> Date: Tue, 26 May 2026 09:19:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(metronome):=20=E5=88=87=E5=90=8E=E5=8F=B0/?= =?UTF-8?q?=E5=B0=8F=E7=AA=97=E5=90=8E=E8=8A=82=E6=8B=8D=E5=A3=B0=E7=BB=A7?= =?UTF-8?q?=E7=BB=AD(=E6=94=BE=E5=85=9C=E9=87=8C=E4=B9=9F=E8=83=BD?= =?UTF-8?q?=E5=90=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 两层原因都修: 1. 微信限制(声明后台音频权限): InnerAudioContext 默认在小程序进后台时被强制暂停。 必须显式声明 requiredBackgroundModes,iOS 才允许后台继续发声。 - manifest.json mp-weixin 全局加 requiredBackgroundModes:["audio"] - pages.json 节拍器页 style 也加,双保险 说明:Android 大部分情况无需此声明也能后台,iOS 必需。 2. 代码层(onHide 不再主动 stop): 原 onHide 里 if(isPlaying) stop() 会在切后台/小窗时 立刻把节拍器自己关掉,跟需求相反。 新策略: - onHide 留空 → 切后台/小窗时节拍器继续工作 - onUnmounted 才真正 stop + 释放屏幕常亮 → 用户主动离开 节拍器页(navigateBack/重启)时清理资源 实际场景:健走时把手机塞口袋,锁屏或切到微信聊天, 节拍声依然继续响,无需把手机一直拿着看。 Co-authored-by: Cursor --- TUICallKit-Vue3/manifest.json | 4 +++- TUICallKit-Vue3/pages.json | 3 ++- TUICallKit-Vue3/training/pages/metronome.vue | 15 +++++++++++---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/TUICallKit-Vue3/manifest.json b/TUICallKit-Vue3/manifest.json index 5389584a..642f8e7d 100644 --- a/TUICallKit-Vue3/manifest.json +++ b/TUICallKit-Vue3/manifest.json @@ -57,7 +57,9 @@ "optimization" : { "subPackages" : true }, - "usingComponents" : true + "usingComponents" : true, + /* 节拍器后台播放需要,iOS 必需 */ + "requiredBackgroundModes" : ["audio"] }, "mp-alipay" : { "usingComponents" : true diff --git a/TUICallKit-Vue3/pages.json b/TUICallKit-Vue3/pages.json index 8fe89074..229719a4 100644 --- a/TUICallKit-Vue3/pages.json +++ b/TUICallKit-Vue3/pages.json @@ -122,7 +122,8 @@ "navigationBarBackgroundColor": "#f8fafc", "navigationBarTextStyle": "black", "backgroundColor": "#f8fafc", - "disableScroll": true + "disableScroll": true, + "requiredBackgroundModes": ["audio"] } } ] diff --git a/TUICallKit-Vue3/training/pages/metronome.vue b/TUICallKit-Vue3/training/pages/metronome.vue index 023797ee..3f8bda59 100644 --- a/TUICallKit-Vue3/training/pages/metronome.vue +++ b/TUICallKit-Vue3/training/pages/metronome.vue @@ -244,14 +244,21 @@ onShow(() => { preload() }) +/** + * onHide 故意不 stop: + * - 切到后台 / 微信"小窗" 都会触发 onHide + * - 配合 pages.json 的 requiredBackgroundModes:["audio"], + * 小程序退到后台后节拍声仍然可以继续(健走时把手机放兜里也能听到响) + * - 真正离开节拍器页(navigateBack/重启) 会 onUnload+onUnmounted, + * 在那里清理屏幕常亮 + */ onHide(() => { - if (isPlaying.value) { - stop() - uni.setKeepScreenOn({ keepScreenOn: false }) - } + /* 不再主动 stop, 让节拍器在后台继续工作 */ }) onUnmounted(() => { + /* 页面卸载才真正停 + 释放屏幕常亮 */ + if (isPlaying.value) stop() uni.setKeepScreenOn({ keepScreenOn: false }) })