更新记录

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)自己画多边形或圆

重要:使用前提

  1. 高德开放平台账号(https://lbs.amap.com,需实名认证),创建应用并申请 Android Key:需绑定包名 + 发布版安全码 SHA1(keytool -list -v -keystore 你的签名证书)
  2. 隐私合规必须先调用:高德 SDK 强制要求,未完成合规调用一切能力返回 1907 错误。
  3. 地图组件 <omni-amap-view> 只能在 nvue 页面使用(uni-app 兼容模式 UTS 组件的平台限制);不需要地图界面的业务可以直接在 vue 页面调用本插件的全部 API 函数。
  4. 修改插件原生代码后需重新制作自定义调试基座,标准基座不生效。
  5. 关于二次开发:付费插件由插件市场自动加密除 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。顺序不可颠倒:

  1. 宿主 App 首次启动先展示自己的隐私政策,并在政策中列明高德 SDK(名称、提供方、使用目的、收集的信息、第三方隐私政策链接);
  2. 用户点击「同意」之后,才允许初始化任何地图/定位能力;
  3. 同意后再依次调用 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 条款。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android 必须声明 INTERNET、ACCESS_NETWORK_STATE、ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION(定位由用户在系统设置中授权);使用持续/后台定位或地理围栏时,还需 ACCESS_BACKGROUND_LOCATION、FOREGROUND_SERVICE、FOREGROUND_SERVICE_LOCATION、POST_NOTIFICATIONS,并在隐私政策中说明后台定位用途。iOS 需 NSLocationWhenInUseUsageDescription(后台定位另需 NSLocationAlwaysAndWhenInUseUsageDescription)

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件自身不采集、不存储、不上传任何用户数据;启用定位/逆地理/POI/路线/导航时,坐标与关键词由高德官方 SDK 发送至高德服务器(受高德隐私政策约束),插件不落盘、不转发至其他服务器。高德 SDK 另会读取网络状态与设备信息用于服务鉴权与安全风控,详见 https://lbs.amap.com/pages/privacy/ 。隐私合规接口(updatePrivacyShow/updatePrivacyAgree)为高德 SDK 强制要求,必须在用户同意宿主 App 隐私政策之后调用;日志中的 Key 与坐标已脱敏。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。