本方案提供了符合平台规范的音频缓存实现,通过分层设计确保功能可靠性,同时预留扩展点支持未来优化需求。
📦 音频缓存与播放流程说明
项目目标
实现App端音频资源的自动缓存与播放:
- 获取远程音频URL
- 下载文件至本地
_downloads/
目录 - 优先使用缓存音频进行播放
- 提供缓存管理功能(大小查看、清理)
关键问题与解决方案
问题 | 解决方案 |
---|---|
无法保存到_downloads |
使用plus.io.resolveLocalFileSystemURL 操作路径 |
文件名非法字符 | 使用safeFileName() 函数过滤非法字符 |
缓存安全性 | 后端代理请求敏感操作 |
一、获取音频URL流程
安全优化方案
发送单词 通过 前端 后端服务 安全校验 生成加密签名 请求音频API 返回音频URL
实施要点:
- 前端仅传输必要参数
- 敏感操作(签名生成)在后端完成
- 增加请求合法性验证
二、缓存与播放核心流程
主流程实现(playAudio函数)
javascript
async function playAudio(id, remoteUrl) {
// 平台检测
if (isH5Platform()) {
return playRemoteAudio(remoteUrl); // H5直接播放
}
// 生成缓存文件名
const fileName = `audio-cache-${safeFileName(id)}.mp3`;
const localPath = `_downloads/${fileName}`;
// 检查缓存是否存在
if (await fileExists(localPath)) {
return playLocalAudio(localPath);
}
// 下载并缓存
try {
const tempPath = await downloadFile(remoteUrl);
const permanentPath = await saveToDownloads(tempPath, fileName);
playLocalAudio(permanentPath);
} catch (error) {
playRemoteAudio(remoteUrl); // 降级方案
}
}
文件名安全处理
javascript
function safeFileName(id) {
// 保留安全字符,过滤特殊符号
return id.replace(/[^a-zA-Z0-9\-_\.]/g, '');
}
三、本地缓存操作详解
缓存大小获取
javascript
async function getAudioCacheSize() {
return new Promise((resolve) => {
getDirectoryEntries('_downloads/', (entries) => {
const cacheFiles = entries.filter(e => e.name.startsWith('audio-cache-'));
const totalSize = calculateTotalSize(cacheFiles);
resolve(formatFileSize(totalSize));
});
});
}
缓存清理
javascript
async function clearAudioCache() {
return new Promise((resolve) => {
getDirectoryEntries('_downloads/', (entries) => {
const deletions = entries
.filter(e => e.name.startsWith('audio-cache-'))
.map(file => deleteFile(file));
Promise.all(deletions).then(() => resolve(true));
});
});
}
缓存保存流程
App TempStorage PermanentStorage AudioPlayer 下载文件 返回临时路径 请求文件转移 返回永久路径 播放音频 App TempStorage PermanentStorage AudioPlayer
关键步骤:
- 下载文件到临时存储
- 通过
copyTo
操作转移到永久目录 - 系统自动清理临时文件
🔚 功能总结
功能模块 | 实现方式 |
---|---|
音频URL获取 | 后端代理请求,前端传输必要参数 |
播放入口 | playAudio(id, url) 统一入口 |
缓存位置 | _downloads/audio-cache-{safeID}.mp3 |
文件转移 | 系统API实现安全文件转移 |
缓存管理 | getAudioCacheSize() 和 clearAudioCache() |
异常处理 | 缓存失败时自动播放远程音频 |
注意事项
- 平台权限:确保App有本地存储权限
- 缓存策略:
- 建议添加缓存上限(如100MB)
- 实现LRU(最近最少使用)清理机制
- 网络优化:
- 大文件下载显示进度条
- 支持暂停/恢复下载
- 安全存储:敏感内容建议加密存储