本方案提供了符合平臺規范的音頻緩存實現,通過分層設計確保功能可靠性,同時預留擴展點支持未來優化需求。
📦 音頻緩存與播放流程說明
項目目標
實現App端音頻資源的自動緩存與播放:
- 獲取遠程音頻URL
- 下載文件至本地
_downloads/
目錄 - 優先使用緩存音頻進行播放
- 提供緩存管理功能(大小查看、清理)
關鍵問題與解決方案
問題 | 解決方案 |
---|---|
無法保存到_downloads | 使用plus.io.resolveLocalFileSystemURL 操作路徑 |
文件名非法字符 | 使用safeFileName() 函數過濾非法字符 |
緩存安全性 | 后端代理請求敏感操作 |
一、獲取音頻URL流程
安全優化方案
實施要點:
- 前端僅傳輸必要參數
- 敏感操作(簽名生成)在后端完成
- 增加請求合法性驗證
二、緩存與播放核心流程
主流程實現(playAudio函數)
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); // 降級方案
}
}
文件名安全處理
function safeFileName(id) {
// 保留安全字符,過濾特殊符號
return id.replace(/[^a-zA-Z0-9\-_\.]/g, '');
}
三、本地緩存操作詳解
緩存大小獲取
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));
});
});
}
緩存清理
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));
});
});
}
緩存保存流程
關鍵步驟:
- 下載文件到臨時存儲
- 通過
copyTo
操作轉移到永久目錄 - 系統自動清理臨時文件
🔚 功能總結
功能模塊 | 實現方式 |
---|---|
音頻URL獲取 | 后端代理請求,前端傳輸必要參數 |
播放入口 | playAudio(id, url) 統一入口 |
緩存位置 | _downloads/audio-cache-{safeID}.mp3 |
文件轉移 | 系統API實現安全文件轉移 |
緩存管理 | getAudioCacheSize() 和 clearAudioCache() |
異常處理 | 緩存失敗時自動播放遠程音頻 |
注意事項
- 平臺權限:確保App有本地存儲權限
- 緩存策略:
- 建議添加緩存上限(如100MB)
- 實現LRU(最近最少使用)清理機制
- 網絡優化:
- 大文件下載顯示進度條
- 支持暫停/恢復下載
- 安全存儲:敏感內容建議加密存儲