在 UniApp 开发 App 端离线地图功能时,uniapp提供的接口 uni.getFileSystemManager() 系统报不存在和uni.removeSavedFile(OBJECT)方法的失效
改用 5+ App 提供的 plus.io API 可大幅提升文件删除的稳定性和兼容性。以下是完整的重构方案,可直接用于生产环境。
一、核心重构思路
- 基于
plus.io实现文件 / 目录的精准删除,适配 App 端原生文件系统; - 封装 Promise 异步调用,兼容原有业务逻辑;
- 精细化错误兜底(文件不存在 / 路径解析失败时,视为删除成功,避免用户感知异常);
- 与全局下载配置联动,保证删除路径与下载路径一致。
/**
* 核心方法:基于plus.io删除本地文件/目录
* @param {String} fileName 要删除的文件名(含后缀,如xxx.mbtiles)
* @returns {Promise<Boolean>} 删除结果(成功resolve true,失败reject错误信息)
*/
_deleteLocalFile(fileName) {
return new Promise((resolve, reject) => {
// 1. 获取全局配置的本地文件根路径(与下载路径保持一致)
const baseMapPath = getApp().globalData.download.baseMapPath; //这里自己设定文件的跟路径
const targetFilePath = baseMapPath + fileName; // 拼接路径和文件名称
console.log(`[删除文件] 目标路径:${targetFilePath}`);
const localFileUrl = plus.io.convertLocalFileSystemURL(targetFilePath);
plus.io.resolveLocalFileSystemURL(localFileUrl, (entry) => {
if (entry.isFile) {
entry.remove(
() => {
console.log(`[删除文件] 成功:${fileName}`);
resolve(true); },
(error) => {
console.error(`[删除文件] 失败:${fileName}`, error);
// 兜底:文件不存在时,视为删除成功
if (error.message?.includes('not found') || error.message?.includes('不存在')) {
resolve(true);
} else {
reject(new Error(`删除文件失败:${error.message || error}`));
}
}
);
}
}, (error) => {
console.error(`[解析路径失败] ${targetFilePath}`, error);
// 兜底:路径不存在时,视为删除成功
if (error.message?.includes('not found') || error.message?.includes('不存在')) {
resolve(true);
} else {
reject(new Error(`解析文件路径失败:${error.message || error}`));
}
});
});
}
二、使用注意事项
- 运行环境限制:
plus.io仅支持 App 端(5+ Runtime),H5 / 小程序端需单独做兼容处理; - 权限配置:Android 端需在
manifest.json中配置文件读写权限:
"android": {
"permission": [
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"
]
}