更新记录
1.0.0(2026-10-27)
初版
平台兼容性
uni-app(5.26)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | × | × | √ | 1.0.0 | √ | 1.0.0 | 5.0 | 1.0.0 | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
omni-amap 高德地图+定位+导航+POI+离线地图+地理围栏(UTS 组件插件)
基于高德官方最新 SDK 封装的 uni-app UTS 插件:地图组件 + 定位(单次/持续/后台保活)+ 地理编码与逆地理 + POI 搜索 + 路线规划与导航 + 离线地图 + 地理围栏,并内置隐私合规接口与日志脱敏(Key 掩码、坐标降精度)。
当前版本 v1.0.0:Android 端全量可用(地图/定位/逆地理/POI/路线/导航/离线地图/围栏)。iOS 端正在按文末「后续规划」逐里程碑补齐,接口签名与 Android 保持一致。
平台支持
| 平台 | 状态 | 说明 |
|---|---|---|
| Android | ✅ 全量可用 | 地图/定位/编码/POI/路线/导航/离线地图/围栏全部已实现;SDK 走 maven 依赖(云打包自动引入) |
| iOS | 🔶 开发中 | 按文末路线图逐里程碑交付;setAmapKey(androidKey, iosKey) 的第二参已预留,接入方式不变 |
| 鸿蒙 | 🔶 未排期 | 高德鸿蒙版 SDK 能力与安卓/iOS 有差异,需评估后再定 |
| 小程序 / H5 | ❌ 不支持 | UTS 原生插件只能运行在 App 端,非技术缺陷而是平台限制,不在规划内 |
功能边界(购买前必读)
插件内没有试用次数、时长、功能开关或白名单,已列出的能力购买后全部可调用。以下是实测确认的边界,请先看一眼再买:
| 项 | 支持 | 不支持 / 需注意 |
|---|---|---|
| 路线规划 / 导航方式 | 驾车 drive、骑行 ride、步行 walk |
❌ 公交路线(搜索 SDK 有该接口,本插件未接);❌ 货车导航;传入其他 type 直接回调 type 仅支持 drive/ride/walk |
打车费用 taxiCost |
仅驾车路线返回 | 骑行/步行为 0 |
路线折线 path |
返回首条路径坐标 | 超过 800 点会等间隔抽稀,不适合做精确轨迹回放 |
Marker 图标 icon |
本地文件绝对路径(可带 file://) |
❌ http/https 网络图、❌ base64;解码失败自动回落默认图标 |
| 离线地图 | 城市列表/下载/进度/删除/更新检查/内置管理页 | 高德 v11+ 将离线地图列为高阶服务,需你的 Key 在高德侧已开通该能力,否则下载失败 |
| 内嵌导航视图 | 能显示官方导航画面、能下发 calc/start/emu/stop 指令 |
⚠️ 已知限制:uni-app 兼容模式的 nvue 页面里,组件 $emit 的 navievent 实测收不到回执(原生侧日志正常),因此内嵌方案的“算路成功/失败”无法回传页面。要稳定使用导航请用 naviStartPage;必须自定义导航 UI + 事件回执的场景,请评估后再买或选源码版改造 |
| 地图组件运行环境 | nvue 页面 | API 函数(定位/地理编码/POI/路线/导航/离线地图/围栏)在 App 的 vue 与 nvue 页面均可调用;只有地图组件 <omni-amap-view> 必须放在 nvue 页面(App-vue 下原生组件属性更新不可靠,官方已不推荐),小程序/H5 不可用 |
| 地理围栏关键字 | 圆形(中心+半径)、多边形(≥3 点)自由创建 | ⚠️ 行政区划围栏只吃单个区划名(福田区、深圳市),写成 深圳福田区 高德检索不到,会报错误码 16(插件会自动取“市/省”后一段兜底,并在日志里告知);POI 围栏的关键字需高德能检索到,且 poiType 不能为空(不支持“不限类型”,传空串不走网络直接回错误码 1,日志表现为调用后十几毫秒就失败);用户将应用定位权限设为“模糊位置”时围栏完全不可用(错误码 20);❗ 围栏创建后不会自动出现在地图上(高德只做“进出检测”不负责绘制),需取 geofenceSetListener 回调里的 fences(边界点集 rings / 中心 center + radius)自己画多边形或圆 |
重要:使用前提
- 高德开放平台账号(https://lbs.amap.com,需实名认证),创建应用并申请 Android Key:需绑定包名 + 发布版安全码 SHA1(
keytool -list -v -keystore 你的签名证书) - 隐私合规必须先调用:高德 SDK 强制要求,未完成合规调用一切能力返回 1907 错误。
- 地图组件
<omni-amap-view>只能在 nvue 页面使用(uni-app 兼容模式 UTS 组件的平台限制);不需要地图界面的业务可以直接在 vue 页面调用本插件的全部 API 函数。 - 修改插件原生代码后需重新制作自定义调试基座,标准基座不生效。
- 关于二次开发:付费插件由插件市场自动加密除
interface.uts外的全部.uts与原生混编文件。需自己改原生代码(扩展属性/方法、调整原生行为)的,请购买源码授权版;普通授权版可正常使用与升级,但无法查看和修改原生实现。
Key 配置(使用方必读)
插件包内不含任何高德 Key。Key 必须由使用方用自己的高德开放平台账号申请后自行配置; Android Key 需绑定你的应用包名与签名证书 SHA1,否则地图/定位会报
INVALID_USER_KEY。
两处都要配,缺一不可:
| # | 位置 | 作用 | 是否必需 |
|---|---|---|---|
| 1 | nativeResources/android/manifestPlaceholders.json |
高德定位 SDK 只从 AndroidManifest 的 meta-data com.amap.api.v2.apikey 读 Key;插件清单里写的是占位符 ${AMAP_ANDROID_KEY},打包时替换 |
必需(缺了定位直接失败) |
| 2 | 运行时 setAmapKey('你的Key', '', cb) |
高德地图 SDK(MapsInitializer.setApiKey)走运行时设置,必须在首次创建地图组件前调用 |
必需(缺了地图不加载) |
第 1 项文件位于宿主工程根目录的 nativeResources/android/ 下(目录不存在就自己建):
{
"AMAP_ANDROID_KEY": "你的 Android Key"
}
自检方法:启动后日志出现
[omni-amap][自检] Manifest 高德 Key 已生效: abcd****wxyz(前 4 位 + 后 4 位,中间打码)即配置正确。 若看到「缺失」或「占位符未被替换(含 $)」,说明第 1 项没配好。日志中的 Key 已脱敏(前 4 位 + 后 4 位),可用于核对是否用的是自己的 Key。⚠️ 如果完全没建
manifestPlaceholders.json,云端打包可能报占位符未定义(AMAP_ANDROID_KEY)而中断, 建文件但值留空则能打包成功、但定位会报错——两种情况都按上面的自检日志排查。
隐私合规(上架必读)
高德 SDK 强制要求先完成隐私合规,否则一切能力返回 1907。顺序不可颠倒:
- 宿主 App 首次启动先展示自己的隐私政策,并在政策中列明高德 SDK(名称、提供方、使用目的、收集的信息、第三方隐私政策链接);
- 用户点击「同意」之后,才允许初始化任何地图/定位能力;
- 同意后再依次调用
updatePrivacyShow→updatePrivacyAgree,之后才能调用定位/POI/路线/导航等能力。
// 注意:下面整段必须在「用户已同意宿主隐私政策」之后执行
setAmapKey('你的AndroidKey', '', () => {
updatePrivacyShow(() => {
updatePrivacyAgree(() => {
// 到这里才能 getAmapLocation / 挂载 <omni-amap-view>
})
})
})
- 未同意前不要申请定位权限,也不要挂载地图组件(组件挂载即初始化 SDK)。
- 用户拒绝或撤回同意后,应停止地图与定位能力。
- 插件自身不采集、不存储、不上传任何数据;坐标与关键词由高德 SDK 直接发送至高德服务器。
快速开始
import { setAmapKey, updatePrivacyShow, updatePrivacyAgree, getAmapLocation } from '@/uni_modules/omni-amap'
// 0. 前提:nativeResources/android/manifestPlaceholders.json 已配置 AMAP_ANDROID_KEY(定位必需)
// 1. 配置地图 Key(先于一切高德能力;iOS 端未实现,第二参传空)
setAmapKey('你的AndroidKey', '', res => console.log(res))
// 2. 隐私合规两步(顺序固定,必须等用户点了「同意」之后再做)
updatePrivacyShow(res => {}) // 声明隐私政策包含高德 SDK 条款
updatePrivacyAgree(res => {}) // 用户实际同意后调用
// 3. 单次定位
getAmapLocation({ needAddress: true, timeout: 8000, locationMode: 'high' }, res => {
if (res.errorCode === 0) {
console.log(res.longitude, res.latitude, res.address) // GCJ-02 坐标
} else {
console.log('失败', res.errorCode, res.errorInfo)
}
})
地图组件(nvue 页面)
重要:组件的全部数值/开关属性必须传字符串(uni-app 非 x 的 nvue 下,UTS 组件的 Number/Boolean 属性过桥会静默失败, 并连带破坏整个页面布局:地图层丢失、日志框被顶到页面最上方)。 同理,nvue 下请不要依赖
this.$refs调用组件方法(该通道实测不生效),操控地图请走下方「属性指令通道」。
<template>
<omni-amap-view
v-if="sdkReady"
class="map"
:maptype="mapType"
:center="centerCmd"
:markpoint="markCmd"
@maploaded="onMapLoaded">
</omni-amap-view>
</template>
// 视角:"纬度,经度[,缩放],序号"(末尾序号保证同一坐标重复下达也能触发)
this.centerCmd = '39.90923,116.397428,15,' + (++this.seq)
// 落点:"纬度,经度,序号"
this.markCmd = '39.909,116.397,' + (++this.seq)
// 批量标记 / 路线折线:"纬度,经度;纬度,经度;...;序号"
// 控件开关:"zoom:1,compass:1,scale:1,locbtn:1,序号"
// 蓝点:showmylocation = "1" / "0"
// 导航:navifrom/navito/navivia + naviact("embed|calc|start|emu|stop,序号")
API 一览
API 函数(App 端,当前仅 Android)
| 方法 | 说明 |
|---|---|
setAmapKey(androidKey, iosKey, cb?) |
配置高德 Key,须最先调用 |
updatePrivacyShow(cb?) |
隐私合规第一步 |
updatePrivacyAgree(cb?) |
隐私合规第二步(用户同意后) |
checkLocationPermission(cb) |
检测定位权限 {granted} |
requestLocationPermission(onGranted, onDenied) |
申请定位权限(deniedList 回调) |
getAmapLocation(options?, cb) |
单次定位(GCJ-02),options: {needAddress, timeout, locationMode: high/battery/sensor, gpsEnable} |
naviStartPage(options, cb) |
一键导航页(推荐):打开高德官方路线/导航页。{type:"drive"\|"ride"\|"walk", fromLat, fromLng, toLat, toLng, waypoints?},页面自带多方案列表、开始导航、全览/设置/退出 |
naviCalculateRoute(options, cb) |
只算路不求界面:{type, fromLat, fromLng, toLat, toLng},回调 {distance, duration, wayPoints} |
requestBackgroundLocationPermission(onGranted, onDenied) |
申请后台定位权限(targetSdkVersion < 29 会自动跳过) |
startContinuousLocation(options, onLocation) / stopContinuousLocation() |
持续定位(多次回调,含 speed/direction/address/city 等字段) |
enableAmapBackgroundLocation(cb?) / disableAmapBackgroundLocation(cb?) |
后台保活定位(前台服务 + 常驻通知) |
calculateDistance(coordA, coordB, cb) |
两点球面距离(米),入参 {latitude,longitude} |
convertCoordinate(options, cb) |
WGS-84(GPS 原始)→ GCJ-02 坐标转换 |
geocode(address, city, cb) |
地址 → 经纬度(GCJ-02),city 传空串=全国 |
regeocode(lat, lng, radius, cb) |
经纬度 → 地址,回调含 formatAddress/adcode/township |
poiSearchNearby(options, cb) |
周边搜索 {latitude,longitude,radius?,keyword?,type?} → {pois:[{id,name,latitude,longitude,address,tel,typeDes,distance}],total} |
poiSearchKeyword(keyword, city, options, cb) |
关键字搜索(city 空=全国),结果含 subPois 子 POI |
poiSearchById(poiId, cb) |
POI ID 详情检索 |
planRoute(options, cb) |
路线规划:{type:"drive"\|"ride"\|"walk", fromLat,fromLng,toLat,toLng, strategy?} → {distance,duration,taxiCost,path} |
naviAddStatusListener(cb) / naviClearStatusListener() / naviStop() |
导航状态监听(算路成败/播报/剩余距离时间,多次回调)/ 注销 / 停止 |
getOfflineCityList(cb) |
离线城市列表(含 adcode/大小/版本) |
downloadOfflineCity(cityName, cb) |
按城市名下载离线地图 |
setOfflineDownloadListener(cb) |
下载进度/完成监听(多次回调) |
getOfflineDownloadList(cb) / getOfflineDownloadedList(cb) |
下载中 / 已下载 列表 |
checkOfflineUpdate(cityName, cb) |
检查某城市离线数据是否有更新 |
openOfflineMapPage(cb) |
打开高德内置离线地图管理页 |
geofenceSetListener(cb) |
注册围栏回调:创建结果含 fenceCount + fences(边界点集/中心+半径,需自绘),触发行为含 status/customId/fenceId |
geofenceAddCircle(lat, lng, radius, customId, cb) |
圆形围栏(中心+半径) |
geofenceAddDistrict(keyword, customId, cb) |
行政区划围栏:keyword 只能是单个区划名(福田区 / 深圳市) |
geofenceAddPoi(keyword, poiType, city, size, customId, cb) |
POI 围栏:poiType 必须非空(如「餐饮」「快餐厅」「写字楼」),传空串会被 SDK 直接拒(错误码 1) |
geofenceRemoveAll(cb) |
清除全部围栏 |
导航两种用法:① 要“和高德地图 App 一样”的完整体验(多方案选、导航中可全览/设置/退出)→ 用
naviStartPage; ② 要在自己的页面里内嵌导航视图(<omni-amap-view maptype="navi">+naviact)→ 能出画面、能下发指令, 但回执事件在 nvue 页面不可靠(见「功能边界」),且内嵌的原生按钮可能被叠加层吃触摸; 除非确实需要自定义外框,否则建议直接用 ①。定位注意:
getAmapLocation必须在updatePrivacyAgree之后调用(早于合规会返回1907); 地图自带的定位按钮只有在showmylocation="1"(蓝点开启)之后才会响应, 因此进页先开蓝点再取坐标,定位按钮才会“点了有反应”。
地图组件 <omni-amap-view>
属性指令通道(推荐,全部 String 类型)
| 属性 | 格式 | 说明 |
|---|---|---|
maptype |
normal / satellite / navi |
图层 |
zoom |
"13" |
初始缩放(空串=12) |
latitude / longitude |
"39.90923" |
初始中心(空串=北京) |
showmylocation |
"1" / "0" |
我的位置蓝点 |
logoposition |
bottomLeft / bottomCenter / bottomRight |
高德 Logo 位置 |
center |
"纬度,经度[,缩放],序号" |
移动相机 |
markpoint |
"纬度,经度,序号" |
单枚落点标记 |
markers |
"纬度,经度;...,序号" |
批量标记(自动清上一批) |
polyline |
"纬度,经度;...,序号" |
路线折线(自动清上一条) |
controls |
"zoom:1,compass:0,scale:1,locbtn:1,序号" |
控件显隐 |
navifrom / navito / navivia |
"纬度,经度,序号" |
导航起终点/途经点 |
naviact |
embed / calc / start / emu / stop + ,序号 |
导航指令;embed 完成后组件会自动算路(引擎未就绪会每 800ms 重试),emu=模拟导航(无需走动即可看官方导航 UI)。⚠️ 回执事件限制见「功能边界」 |
事件(@绑定):mapclick、maplongclick、markerclick、markerdragstart、markerdrag、markerdragend、camerachange、cameraidle、maploaded、mylocation、navievent
注意:事件载荷在 uni-app 兼容模式下包在
e.detail里,统一用const e = ev.detail || ev取值。navievent(导航状态/算路结果回执)在 uni-app 兼容模式的 nvue 页面实测不可靠,请勿依赖它做业务分支; 需要导航状态时用naviAddStatusListener()(函数接口,走 JS 回调,不经 nvue 事件通道)。 它监听的是AMapNavi应用级单例,而内嵌导航视图与naviStartPage都自绑同一个单例, 所以两种导航方式的状态(算路成败/播报/剩余距离时间)都能从这一条回调里拿到——请用这个代替navievent。
方法(仅用于 Android 侧二次开发参考,需购买源码授权版;nvue 页面请改用上面的属性指令通道)
| 方法 | 入参 |
|---|---|
| setCenter | {latitude, longitude, zoom?} |
| setZoomLevel / setMapType | number / string |
| addMarker / addMarkers / removeMarker / clearMarkers | {id?, latitude, longitude, title?, snippet?, icon?, alpha?, draggable?, flat?, rotation?} |
| addPolyline | {points: [{latitude,longitude}], width?(px), color?, dashed?} |
| addCircle | {latitude, longitude, radius(米), fillColor?, strokeColor?, strokeWidth?} |
| addPolygon | {points(≥3), fillColor?, strokeColor?, strokeWidth?} |
| removeOverlay / clearOverlays | id |
| fromScreenLocation(x, y, cb) / toScreenLocation(lat, lng, cb) | 屏幕坐标↔经纬度 |
常见错误码
| code | 含义 |
|---|---|
| 1900 | 未调用 setAmapKey |
| 1906/1907 | 隐私合规未完成/未同意 |
| 12 | 缺少定位权限(Android) |
| 高德原生 1907 | 隐私未合规时 SDK 直接拒绝 |
后续规划(路线图)
本插件以“同一套接口、逐端逐能力对齐”为目标推进,iOS 端分里程碑交付,每个里程碑完成即作为同一插件的更新版本发布:
| 里程碑 | 内容 | 状态 |
|---|---|---|
| Ⅰ 基础 | iOS Key 配置、隐私合规两步、地图组件(图层/中心/缩放/Marker/折线/事件) | 开发中 |
| Ⅱ 定位 | 单次定位、持续定位、权限申请(Info.plist 文案)、逆地理编码 | 规划 |
| Ⅲ 搜索与路径 | POI 周边/关键字搜索、地理编码、路线规划 | 规划 |
| Ⅳ 导航 | 一键导航页(驾车/骑行/步行)、导航状态监听 | 规划 |
| Ⅴ 进阶 | 后台保活定位、地理围栏、离线地图 | 规划 |
几点承诺与说明:
- 接口不变:iOS 端沿用现有函数名与回调结构(包括
setAmapKey(androidKey, iosKey)的第二参),已接入 Android 的项目上 iOS 时业务代码无需重写。 - 需自备 iOS Key:高德 Key 分平台,iOS 绑定 Bundle ID,需你在高德控制台单独申请(接口已预留,不需改代码)。
- 里程碑顺序可能根据实际需求调整,但不会删减已发布的能力;已发布能力的问题修复优先级高于新功能。
- 小程序 / H5 不在规划内(UTS 原生插件的平台限制)。
License
商业授权,详见 license 条款。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 28
赞赏 0
下载 12721622
赞赏 1958
赞赏
京公网安备:11010802035340号