如何修改cordova-plugin-dialogs插件的beep函数通知提示音
首先明确问题原因:cordova-plugin-dialogs 10.x版本的iOS端实现已经移除了自定义提示音的支持,默认固定调用系统默认通知音,因此修改系统设置、放置音频到www目录都不会生效。以下是3种可行的解决方案:
方案1:修改插件原生实现(最优适配原插件逻辑)
直接调整插件iOS端的原生代码,支持加载自定义音频:
- 找到插件iOS原生文件:项目路径下的
platforms/ios/[你的应用名]/Plugins/cordova-plugin-dialogs/CDVNotification.m - 将你的自定义wav音频文件添加到iOS项目的
Resources资源目录(注意不要放在www目录下,必须加入原生编译的资源列表) - 找到文件中
beep方法的实现,将原有调用系统默认音的代码替换为如下逻辑:
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"你的音频文件名(不含后缀)" ofType:@"wav"]; SystemSoundID soundID; NSURL *soundUrl = [NSURL fileURLWithPath:soundPath]; AudioServicesCreateSystemSoundID((CFURLRef)soundUrl, &soundID); AudioServicesPlaySystemSound(soundID); // 播放完成后释放资源 AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, (AudioServicesSystemSoundCompletionProc)AudioServicesDisposeSystemSoundID, NULL);
- 如果怕每次执行
cordova prepare覆盖修改,可以编写Cordova hook脚本,每次同步项目时自动替换修改后的CDVNotification.m文件。
方案2:自行实现beep逻辑(无需修改原生插件)
弃用插件自带的beep方法,借助cordova-plugin-media插件实现自定义提示音,跨平台通用:
- 安装依赖插件:
cordova plugin add cordova-plugin-media - 将自定义wav音频放入项目
www/audio/目录下 - 封装自定义beep方法替代原生接口:
// 自定义beep方法,参数为播放次数,默认1次 function customBeep(playTimes = 1) { const media = new Media('audio/你的自定义音频文件名.wav'); let currentCount = 0; const playCycle = () => { if (currentCount >= playTimes) { media.release(); return; } media.play(); currentCount++; // 两次提示音间隔300ms,和原插件逻辑对齐 setTimeout(playCycle, 300); } playCycle(); }
注意:如果需要iOS静音模式下也能播放提示音,可以配合音频会话插件修改音频播放类别即可。
方案3:回退插件版本(不推荐)
如果不需要新版本插件的其他特性,可以回退到支持自定义beep的1.x版本cordova-plugin-dialogs,但要注意验证和当前Cordova iOS平台版本的兼容性。
内容的提问来源于stack exchange,提问作者Asqan
相关产品推荐
相关产品推荐

