尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

uni-app x HarmonyOS 系统定位模块集成指南:uni-location-system 原生模块配置与原理

uni-app x HarmonyOS 系统定位模块集成指南:uni-location-system 原生模块配置与原理 uni-app x HarmonyOS 系统定位模块集成指南uni-location-system 原生模块配置与原理【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app本篇技术指南聚焦 uni-app x 在 HarmonyOS鸿蒙原生工程中集成「系统定位」模块UTS 插件uni-location-system的完整流程覆盖 har 依赖引入、index.generated.ets模块注册含 VDOM 与蒸汽两种模式、底层权限模型与坐标系转换原理以及错误码映射。读完本文你将能够把系统定位能力uni.getLocation、持续定位与位置监听正确接入鸿蒙原生工程并理解其底层实现机制便于二次开发与问题排查。一、模块是什么系统定位uni-location-systemuni-app x 的定位能力通过 provider 机制实现鸿蒙端目前支持「系统定位system」provider。系统定位模块在仓库中对应 UTS 插件 uni-location-system其职责是实现获取当前位置信息使用系统定位功能底层调用 HarmonyOS 的位置服务能力。模块代码按平台拆分位于utssdk目录下见 readme.md 的平台目录说明| 目录/文件 | 目标平台 | 实现语言 | 作用描述 | | -- | -- | -- | -- | | utssdk/app-harmony | HarmonyOS鸿蒙 | UTS、ArkTS | 鸿蒙端系统定位实现 | | utssdk/app-android | Android | UTS、Kotlin、Java | Android 端系统定位实现 | | utssdk/app-ios | iOS | UTS、Swift | iOS 端系统定位实现 | | utssdk/*.uts | 多平台共用 | UTS | 共用实现源码 |其中鸿蒙端的核心文件包括interface.uts定义UniLocationSystemProvider接口继承自UniLocationProviderindex.utsprovider 实现类UniLocationSystemProviderImpl及单次定位逻辑locationChange.uts持续定位前后台与位置监听geolocation.uts封装ohos.geoLocationManager的底层定位与权限逻辑。说明该插件在 uni-app x 项目内正常开发时由编译器自动处理本文面向「鸿蒙原生工程混编」场景需要手动完成依赖配置与模块注册。二、配置依赖引入 har 包系统定位依赖 har 包uni_modules/uni-location-system。该 har 包未发布到鸿蒙 ohpm 仓库需要自行从任意 uni-app x 项目编译到鸿蒙的产物中拷贝。2.1 获取 har 包在任意 uni-app x 项目编译到鸿蒙后产物目录中会生成定位模块的 har 包unpackage/dist/dev/app-harmony/libs/uni_modules__uni_location_system.har将其拷贝到鸿蒙原生工程内例如拷贝到工程的libs目录下作为本地依赖引入。2.2 声明依赖在鸿蒙原生工程根目录的oh-package.json5文件的dependencies字段下添加uni_modules/uni-location-system: ./libs/uni_modules__uni_location_system.har路径需与实际拷贝位置保持一致./libs/前缀表明这是本地文件依赖而非 ohpm 线上包。三、注册模块index.generated.ets 入口鸿蒙原生工程内的 uni_modules 入口文件为/entry/src/main/ets/uni_modules/index.generated.ets如果没有需要自行创建集成细节可参考 docs/native/use/harmonyuts.md 中将 uni_modules 入口文件移动到/entry/src/main/ets/uni_modules/index.generated.ets的步骤以及模块总览 docs/native/modules/harmony/modules.md。在该文件内注册系统定位 API根据渲染模式不同代码有 VDOM 与蒸汽两种写法VDOM 模式import { registerUniProvider, uni } from dcloudio/uni-app-x-runtime import { UniLocationSystemProviderImpl } from uni_modules/uni-location-system export function initUniModules() { initUniExtApi() } function initUniExtApi() { registerUniProvider(location, system, new UniLocationSystemProviderImpl()) }蒸汽Vapor模式import { registerUniProvider, uni } from dcloudio/uni-app-x-vapor-runtime import { UniLocationSystemProviderImpl } from uni_modules/uni-location-system export function initUniModules() { initUniExtApi() } function initUniExtApi() { registerUniProvider(location, system, new UniLocationSystemProviderImpl()) }两种模式的差异仅在于运行时包名VDOM 使用dcloudio/uni-app-x-runtime蒸汽模式使用dcloudio/uni-app-x-vapor-runtime蒸汽模式 SDK 需 HBuilderX 5.25见 docs/native/README.md。注册的核心动作一致通过registerUniProvider(location, system, impl)将 provider 实现注册到定位服务提供商的扩展点上location为服务名system为 provider 标识与uni.getLocation中provider: system参数对应。3.1 在 EntryAbility 中调用初始化注册完成后还需在鸿蒙工程entry/src/main/ets/entryability/EntryAbility.ets文件中调用初始化方法依据 docs/native/modules/harmony/modules.md 的约定import { initUniModules } from ../uni_modules/index.generated initUniModules()这样应用启动时即完成定位 provider 的注册uni.getLocation等 API 才能在鸿蒙端被解析到系统定位实现。四、底层实现原理UniLocationSystemProviderImpl注册进 provider 机制的实现类为UniLocationSystemProviderImpl其完整定义位于 index.uts。从源码结构看它实现了UniLocationSystemProvider接口并对外暴露以下能力| 方法 | 对应业务能力 | | -- | -- | | getLocation(options) | 单次定位对应uni.getLocation| | startLocationUpdate(options) | 开始持续定位 | | startLocationUpdateBackground(options) | 开始后台持续定位 | | stopLocationUpdate(options) | 停止持续定位 | | onLocationChange(callback) | 注册位置变化监听 | | onLocationChangeError(callback) | 注册定位错误监听 |provider 的id为system、description为系统定位与注册时的 provider 标识一致。4.1 单次定位流程单次定位的核心逻辑在_getLocation见 index.uts流程如下申请前台权限默认申请ohos.permission.APPROXIMATELY_LOCATION模糊定位当options.isHighAccuracy为 true 时追加ohos.permission.LOCATION精确定位发起定位请求构造geoLocationManager.CurrentLocationRequest高精度时priority取ACCURACY否则取FIRST_FIX超时控制highAccuracyExpireTime有值则作为timeoutMs否则高精度模式下默认 3000ms结果组装返回GetLocationSuccess包含 latitude、longitude、speed、accuracy、altitude、verticalAccuracy、horizontalAccuracy、address 字段逆地理编码当options.geocode为 true 时调用getAddressesFromLocation解析placeName填入 address注意虽然 docs/api/get-location.md 兼容性表对 HarmonyOS 逆地理编码标注为 x但当前鸿蒙源码已实现该分支实际行为以官方发布版本的兼容性标注为准坐标系转换当type gcj02时通过map.convertCoordinate将 WGS84 坐标转换为 GCJ02 坐标。4.2 权限请求与处理鸿蒙端权限请求封装在requestPermission见 geolocation.uts通过abilityAccessCtrl.createAtManager().requestPermissionsFromUser弹窗申请只要任一权限被拒绝即视为申请失败。权限类型定义index.utstype Permission | ohos.permission.APPROXIMATELY_LOCATION | ohos.permission.LOCATION | ohos.permission.LOCATION_IN_BACKGROUNDAPPROXIMATELY_LOCATION前台模糊位置权限默认申请LOCATION前台精确定位权限高精度时申请LOCATION_IN_BACKGROUND后台位置权限。后台权限特殊处理出于安全隐私要求应用不能通过弹窗被授予后台位置权限。源码中的处理逻辑是见 geolocation.uts调用checkBackgroundPermission用atManager.checkAccessTokenSync检查后台权限未授权时通过uni.showModal提示用户需要允许应用在后台获取位置信息方可继续确认后拉起系统设置页com.huawei.hmos.settings引导用户手动授予。用户可在以下路径手动设置设置 隐私和安全 位置信息 具体应用设置 应用和元服务 某个应用4.3 坐标类型校验持续定位场景下watchPosition会校验coordsType见 geolocation.uts仅支持wgs84与gcj02其他值直接返回错误COORDS_TYPE_ERROR并返回-1表示创建失败gcj02模式下每次回调同样经过map.convertCoordinate做坐标转换。五、API 参数与坐标系说明系统定位对外暴露的参数与uni.getLocation对齐完整定义见 docs/api/get-location.md。与鸿蒙系统定位强相关的关键参数| 参数 | 类型 | 默认值 | 说明 | | -- | -- | -- | -- | | provider | string | system | 定位服务提供商目前支持 system系统定位、tencent腾讯定位注册时以system标识 | | type | string | wgs84 |wgs84返回 GPS 坐标gcj02返回可用于uni.openLocation的坐标 | | isHighAccuracy | boolean | false | 开启高精度定位鸿蒙端会额外申请LOCATION权限 | | highAccuracyExpireTime | number | 3000 | 高精度定位超时时间(ms)该值 3000ms 以上高精度定位才有效果 | | geocode | boolean | false | 传入 true 解析地址鸿蒙兼容性以发布版本标注为准 | | altitude | boolean | false | 传入 true 返回高度信息会减慢接口返回速度 | | success / fail / complete | function | - | 成功 / 失败 / 结束回调 |GetLocationSuccess主要返回字段| 字段 | 说明 | | -- | -- | | latitude | 纬度范围 -90~90负数表示南纬 | | longitude | 经度范围 -180~180负数表示西经 | | speed | 速度单位 m/s | | accuracy | 位置精确度 | | altitude | 高度单位 m | | verticalAccuracy | 垂直精度单位 m鸿蒙从altitudeAccuracy取值 | | horizontalAccuracy | 水平精度单位 m鸿蒙从directionAccuracy取值缺失时为 0 | | address | 地址信息未解析时为 null |六、持续定位与位置监听持续定位相关实现位于 locationChange.uts通过模块级变量保存监听回调与 watchId6.1 开始/停止定位startLocationUpdate调用底层watchPosition建立监听底层以interval: 1、PowerConsumptionScenario.HIGH_POWER_CONSUMPTION的LocationRequest订阅geoLocationManager.on(locationChange)见 geolocation.utsenableHighAccuracy固定为 truestartLocationUpdateBackground若已存在 watch则直接校验后台权限否则建立带background: true的监听stopLocationUpdate调用geoLocationManager.off(locationChange, handler)移除监听并重置started与watchId。6.2 监听回调onLocationChange(callback) // 位置变化回调 onLocationChangeError(callback) // 定位错误回调实现中通过_onLocationChange、_onLocationChangeError两个模块级变量保存回调底层watchPosition的 success/error 分支分别触发。首次建立监听失败时startLocationUpdate的 Promise 会 reject 并透传错误给options.fail。6.3 多小程序实例隔离值得注意的细节是geolocation.uts通过getCurrentMP()按appId维护独立的PositionWatchStores并在beforeClose事件中自动清理对应 watch见 geolocation.uts避免多实例场景下位置监听互相干扰。七、错误码映射鸿蒙端将系统层错误码统一映射为 uni-app x 规范错误码映射表在 index.uts 与 geolocation.uts 中定义两处保持一致| 鸿蒙错误 | 映射 errCode | 含义 | | -- | -- | -- | | 3301100 | 1505003 | 系统定位未开启请在系统设置中开启系统定位 | | PERMISSION_ERROR | 1505004 | 应用定位权限未开启 | | COORDS_TYPE_ERROR | 1505601 | 不支持的定位类型 | | 3301300 | 1505603 | 定位超时 | | 3301000 / default | 1505602 | 捕获定位失败 |未匹配到的错误码统一落到1505602defaultErrorCode业务侧可依据 docs/api/get-location.md 的 errCode 表做统一错误提示。八、集成步骤速览与注意事项8.1 操作清单在 uni-app x 项目编译鸿蒙产物从unpackage/dist/dev/app-harmony/libs/拷贝uni_modules__uni_location_system.har到鸿蒙原生工程在鸿蒙工程oh-package.json5的dependencies中添加uni_modules/uni-location-system: ./libs/uni_modules__uni_location_system.har在/entry/src/main/ets/uni_modules/index.generated.ets中按 VDOM/蒸汽模式注册UniLocationSystemProviderImpl在EntryAbility.ets中调用initUniModules()在module.json5中声明ohos.permission.APPROXIMATELY_LOCATION等权限前台/后台权限按需声明后台定位需引导用户在系统设置中手动授权「始终允许」。8.2 注意事项har 包未发布到 ohpm升级 uni-app x 版本后需重新从最新编译产物拷贝替换VDOM 与蒸汽模式的运行时依赖包名不同注册代码需按项目实际模式选择后台定位权限无法弹窗申请必须通过设置界面手动授予源码已内置uni.showModal引导逻辑geocode与horizontalAccuracy等字段在鸿蒙端的行为以官方 API 兼容性标注为准源码实现可能与文档表格存在版本差异坐标系默认返回 wgs84若需在uni.openLocationgcj02中使用应显式传type: gcj02转换由底层map.convertCoordinate完成。【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表