uni-app小程序iOS录音没声音,主因是物理静音键开启导致系统级静音,需在App.vue的onLaunch中调用uni.setInnerAudioOption({obeyMuteSwitch:false})全局配置绕过限制,且仅对微信小程序生效。

uni-app小程序录音没声音?先确认是不是iOS静音键在作祟
很多开发者一看到“录音没声音”,立刻怀疑代码或权限,其实90%的iOS真机场景下,问题就卡在物理静音键上——侧边开关拨到橙色状态时,uni.getRecorderManager() 录出来的文件是空的,或者播放时完全无声,但控制台不报错、start() 和 stop() 都走通。
这不是bug,是iOS系统级行为:录音过程本身受静音开关影响,哪怕你已经拿到麦克风权限,静音状态下仍无法采集有效音频数据。
- 验证方式:把iPhone侧边静音键拨到关闭(无橙色),再试一次录音 → 如果有声,就是它
- 注意:这个现象只出现在iOS真机,模拟器和Android设备不受影响
- 微信小程序基础库 2.25.0+ 已支持绕过该限制,但需配合原生配置,仅靠JS层设置无效
微信小程序iOS录音无声:必须调用 uni.setInnerAudioOption({ obeyMuteSwitch: false })
别在uni.createInnerAudioContext()实例上设obeyMuteSwitch = false——这个属性对录音无效,只影响播放。真正起作用的是全局音频策略配置,且**必须在App启动阶段执行**,晚于onLaunch就失效。
正确写法(放在App.vue的onLaunch里):
#ifdef MP-WEIXIN
uni.setInnerAudioOption({
obeyMuteSwitch: false
});
#endif
- 这个API只对微信小程序生效,
#ifdef MP-WEIXIN必须包住,否则H5或App端会报错 - 不能写在页面
onLoad或按钮点击里,时机太晚,系统已按默认策略初始化音频栈 - 设置后,iOS静音键不再阻断录音输入,但播放时仍遵循该开关(除非你额外对
innerAudioContext设obeyMuteSwitch)
Android正式包录音无声?检查manifest.json是否启用了Audio模块
HBuilderX调试时录音正常,云打包后没声音、系统权限列表里根本找不到“麦克风”选项——这不是代码问题,而是原生能力缺失。uni-app正式App(非调试包)的录音能力依赖Audio原生模块注入,而这个模块不会自动启用。
必须手动在manifest.json中声明:
"app-plus": {
"modules": {
"Audio": {}
}
}
- 漏掉
"Audio":{},AndroidManifest.xml就不会注入android.permission.RECORD_AUDIO,系统压根不认为你的App有录音资格 - 即使JS里调了
plus.android.requestPermissions(['android.permission.RECORD_AUDIO']),也只会返回“授权成功”,但设置页依然没入口 - 改完要重新云打包,真机安装后进「设置→应用→权限」才能看到麦克风开关
录音文件播放无声?格式和平台解码能力不匹配
录完的文件路径能拿到,uni.createInnerAudioContext()也能加载,但播放时静默——常见于跨平台格式混用。比如Android输出.amr,iOS输出.caf,而H5或微信小程序根本不认识这些格式。
- 微信小程序只认
.mp3和.aac;H5常用.wav或.webm;iOS偏好.m4a - 不要依赖默认格式,录音时显式指定
format参数:uni.startRecord({ format: 'mp3' }) - 如果后端需要统一处理,建议客户端强制转成
mp3,避免iOS录出.caf导致小程序播不了 - 测试时务必用真机+真实网络环境,某些格式在本地开发服务器下能播,上线后因CORS或MIME类型被拦截
最容易被忽略的点:iOS静音键和Audio模块是两个独立开关,一个管输入(录音),一个管输出(播放),但它们共同决定你最终能不能听见声音。改完配置不重启App、不重装包、不清理微信缓存,都可能让改动失效。


















