uni-app App端离线地图包需通过原生SDK下载解压注册,不可用uni.downloadFile直接保存;Android推荐amap-offline-map插件,iOS需手动集成并指定NSCachesDirectory路径;须处理断点续传、状态同步与权限校验。
uni-app
App端离线地图包怎么下载到本地?
离线地图包不能靠
直接存成“可用地图文件”,高德/百度/腾讯的 SDK 对离线包有特定目录结构和校验机制,必须走原生层触发下载 + 解压 + 注册流程。
uni-app 本身不提供地图离线能力封装,得靠原生插件或自定义基座调用原生 SDK。HBuilderX 2.8+ 的「自定义调试基座」支持高德离线地图,但仅限 Android;iOS 需额外配置证书和权限,且苹果审核对后台下载地图包较敏感。
Android 端推荐用
插件(基于高德 4.x SDK),它会自动把下载的
文件解压到
并调用
iOS 端需手动集成高德 SDK,并在
中注册离线地图路径,路径必须是
下的子目录,不能写 Documents
下载前务必检查存储权限(
或 iOS 的
),否则静默失败
为什么 uni.downloadFile 下载的地图包打不开?
因为离线地图不是普通 ZIP 或 DAT 文件——它是 SDK 内部格式,依赖配套的
、
和版本签名。直接用前端 API 下载后,没调用 SDK 的
或
,SDK 根本识别不了。
常见错误现象:
返回空数组,或地图缩放时提示“无离线数据”。
别把下载 URL 指向官网公开的
,那是给桌面端用的;App 必须用 SDK 提供的
方法触发下载
不要手动移动或重命名下载后的文件夹,高德 SDK 会校验
和 CRC32
模拟器上无法使用离线地图(高德 SDK 明确禁用),必须真机调试
如何在 uni-app 里调用原生离线地图接口?
不能用
前缀方法,得通过
加载原生模块,或用
向原生层发指令(需提前在 manifest.json 里配置原生插件)。
uni-app电商系统实战精讲课程课件
uni-app电商系统实战精讲课程
下载
以 Android 高德插件为例,典型调用链是:
→ 原生层执行
→ 下载完成回调通知 JS 层。
插件 JS 接口名通常类似
,不是
城市 code 必须用高德官方编码(如北京是
),不能传中文名或拼音
监听进度要用插件提供的
回调,不是
失败回调里注意区分网络错误(
)和 SDK 错误(
)
离线地图包体积大,用户中途退出怎么办?
高德单个城市离线包普遍 200–800MB,下载中断后不会自动续传,SDK 默认删除残缺文件。必须自己实现断点记录 + 恢复逻辑,且 iOS 上因沙盒限制更难处理。
真实场景中,用户切后台、锁屏、系统杀进程都会导致下载中断,这时候不能只依赖 SDK 自带状态。
每次开始下载前,先查本地是否已有部分文件(比如存在
但大小不足),再决定是 resume 还是 restart
把下载状态存进
,key 用城市 code + 版本号组合,避免多城市并发冲突
Android 上建议在
时暂停下载,在
时恢复;iOS 则需监听
别让用户等完整个包再提示“下载完成”——下载完只是第一步,还要等 SDK 解压并 build index,这个过程可能卡 10–30 秒,期间
仍返回空
离线地图最麻烦的不是下载动作本身,而是状态同步:JS 层看到“100%”,原生层可能还在解压索引,而用户已经点了“使用离线地图”,结果白屏。这个间隙期必须加 loading 锁定操作,不能只信下载回调。
uni.downloadFileamap-offline-map.dat/sdcard/amap_offline/AMapManager.getInstance().addOfflineMap()AppDelegate.mNSCachesDirectoryandroid.permission.WRITE_EXTERNAL_STORAGENSLocationWhenInUseUsageDescriptionmapindex.datcitylist.dataddOfflineMapupdateOfflineMapAMapOfflineMapManager.getOfflineMapList()amap_offline.zipAMapOfflineMapManager.downloadCityoffline_map_versionuni.uni.requireNativePluginuni.postMessagejs 调用 native.downloadCity('北京')AMapOfflineMapManager.downloadCity()offlineMap.downloadCitydownloadFile110000onProgressonDownloadProgressERR_NETWORKOFFLINE_MAP_DOWNLOAD_FAILbeijing_110000_v5.6.0.datuni.setStorageSynconPauseonResumeUIApplicationDidEnterBackgroundNotificationgetOfflineMapList