目录

获取当前位置信息有一定的延迟

问题现象

在用户打开应用并进入位置信息显示页面后,当前地理位置信息未能及时呈现,需要经过一段时间的等待才能获取。期间未向用户显示任何提示信息或仅显示定位失败的提示,这可能造成用户的等待焦虑。

背景知识

问题定位

打开应用进入定位信息页面,使用UI布局结合背景知识中相关API接口分析定位信息的获取逻辑。

  1. 搜索getCurrentLocation,检查是否在位置信息页面展示前调用并获取位置。
  2. 对于单次获取位置信息的场景,检查是否优先通过getLastLocation()获取缓存的最新位置。
  3. 根据背景知识中请求参数,搜索并查看其priority(优先级信息)和scenario(场景信息)设置是否合理,符合当前场景需求。
  4. 对于需要后台运行时也访问设备位置的场景(持续定位),查看module.json5配置文件中是否有ohos.permission.KEEP_BACKGROUND_RUNNING的权限声明,并搜索startBackgroundRunning和stopBackgroundRunning,检查申请和取消长时任务的逻辑是否完善。

分析结论

[h2]场景一

使用getCurrentLocation()接口是异步获取当前定位,同时定位服务(GNSS定位、基站定位、WLAN/蓝牙定位)需要时间来获取位置,可能由于场地、网络等原因导致定位信息获取延迟,影响用户体验。

[h2]场景二

对于单次获取位置信息的场景,未优先通过getLastLocation()获取缓存的最新位置。

[h2]场景三

对于当前定位场景选用了不合理的请求参数,比如priority优先级信息和scenario场景信息设置不正确。

[h2]场景四

对于需要后台运行时也访问设备位置的场景,未申请长时任务导致每次打开应用需要重新获取位置。

修改建议

[h2]场景一

优化定位信息获取逻辑:

  1. 进入页面前获取定位。
  2. 进入页面加载(或获取定位)时显示“加载中”(或“定位中”)提示。

[h2]场景二

单次定位场景,优先使用getLastLocation()接口获取系统缓存的最新位置,可以减少系统功耗(如果系统当前没有缓存位置会返回错误码)。

如果对位置的新鲜度比较敏感,可以先获取缓存位置,将位置中的时间戳与当前时间对比,若新鲜度不满足预期可以使用getCurrentLocation()再去获取。

[h2]场景三

优化定位请求参数,根据LocationRequestScenario位置请求中定位场景类型和LocationRequestPriority位置请求中位置信息优先级类型介绍,采用合理的定位策略优化用户体验。

[h2]场景四

应用在后台运行时也需要访问设备位置,需要申请LOCATION类型的长时任务。