Cordova Media Plugin在iOS端无法打开文件,报MEDIA_ERR_ABORTED错误
我之前也踩过cordova-plugin-media在iOS上触发MEDIA_ERR_ABORTED的坑,结合你描述的情况(Android正常、切换目录无效但文件确实存在),给你几个针对性的排查和解决方向:
1. 确保文件路径格式完全正确
iOS对文件URL的格式要求比Android严格,哪怕路径只差一个斜杠或者协议头,都可能导致无法加载。你可以试试用resolveLocalFileSystemURL先验证文件的可访问性,同时用文件条目生成的标准URL来初始化Media对象:
// 替换成你的文件名 const fileName = "your-audio-file.mp3"; const filePath = cordova.file.documentsDirectory + fileName; window.resolveLocalFileSystemURL(filePath, function(fileEntry) { console.log("✅ 文件可访问,路径:", fileEntry.toURL()); // 用fileEntry生成的URL创建Media实例 const media = new Media( fileEntry.toURL(), () => console.log("播放成功"), (err) => console.error("播放错误:", err.code, err.message) ); media.play(); }, function(err) { console.error("❌ 文件无法访问:", err.code, err.message); } );
这个方法能帮你确认文件是否真的在沙箱内可被访问,同时避免手动拼接路径时的格式错误。
2. 检查并更新cordova-plugin-media版本
旧版本的插件可能存在iOS 15+的兼容性问题,尤其是沙箱权限和URL处理逻辑的bug。建议你卸载重装最新版插件:
# 移除旧插件 cordova plugin remove cordova-plugin-media # 安装最新稳定版 cordova plugin add cordova-plugin-media
安装完成后记得重新编译iOS项目,确保新的插件代码被打包进去。
3. 配置iOS音频会话
iOS的音频会话管理很严格,如果会话类别设置不当,可能会导致播放请求被系统中止。你可以在config.xml中添加以下配置,强制设置音频会话为播放模式:
<!-- 确保应用拥有音频播放权限 --> <preference name="AudioSessionCategory" value="playback" /> <!-- 默认模式即可,适配大部分播放场景 --> <preference name="AudioSessionMode" value="default" />
这个配置能让你的应用优先获取音频会话权限,减少被系统中断的概率。
4. 验证音频文件本身的兼容性
虽然你说文件是MP3,但有些特殊编码的MP3(比如非标准比特率、VBR编码异常)在iOS上可能无法被原生播放器识别。建议你换一个标准的MP3文件(比如用常见的128kbps CBR编码)测试,如果能正常播放,说明原文件存在兼容性问题,需要重新编码。
5. 排查iOS沙箱权限细节
即使文件在documentsDirectory或dataDirectory,如果是通过第三方插件(比如cordova-plugin-file-transfer)下载的,可能存在权限继承问题。你可以在Xcode中打开项目,查看Info.plist是否添加了必要的权限声明,比如:
<!-- 如果需要从外部导入文件,添加这个权限 --> <key>NSDocumentsFolderUsageDescription</key> <string>需要访问文档目录以加载音频文件</string>
不过通常应用自身的沙箱目录不需要额外权限,但添加声明能避免iOS 14+的权限拦截问题。
内容的提问来源于stack exchange,提问作者Stachu

