河南省勘察质量监督管理平台。对地勘外业备案进行流程化管理;现场见证与飞行检查联动。
这是一个比较简单的项目;本文补充记录开发移动iOS端「工程勘察」过程中遇到的问题及解决方案。

围栏

描述

在设备满足特定场景前提下,当用户手持安装应用的设备进入/离开勘察工作区域时,程序需要给用户进行响应及提醒。

实际情况中,由于工作场景的不同,围栏个数不确定。比如地铁项目、(跨区的)园区建设项目。

针对某个工程,要求程序的提示不能太过频繁。即当用户在项目围栏边界区域连续触发进入/离开工作区域时,不能重复提醒。且需要考虑用户多设备的情况。

  • 进入围栏

    • 程序未启动 -> 打开程序,直接打开项目操作详情页,方便用户操作。
    • 若参与项目的状态处于「工作中」状态下
      • 检查用户针对该项目的最新操作状态,处理异常。
    • 若参与项目的状态处于「空闲中」状态下,给用户提示。用户可选择交互动作包括:
      • 刷新工程操作页面。
      • 进入项目操作页。
  • 离开

    • 若参与项目的状态处于「工作中」状态下,程序在后台进行「签退」操作。

方案

地理围栏借助于 高德地图 配合后台模式来实现。
程序的提醒频次控制借助于 SQLite 数据库缓存来实现。
后续相关操作借助于 观察者 模式实现。

此处重点说明下程序提醒频次控制的实现思路及流转次序。

缓存数据库中主要存储以下几点信息:

  • 标识:用于工程和地理围栏的挂钩。
  • 工作状态:用于判断用户针对该工程的操作。
  • 触发时机:用于频次控制。
  • 其他:用于组织提醒用户内容等。

流转次序如下:

  • 若用户是外业见证人员,则在程序启动时,获取用户所参与的项目的总览信息(特别说明包括外业工作状态)。
  • 构建并监听项目的地理围栏。
  • 触发进入围栏操作时
    • 根据地理围栏标识(移动端自行约定),在本地SQLite数据库中进行碰撞,查找缓存中的工程。
    • 若能找到工程,则进行以下操作。以兼容用户多设备操作的情况。
      • 获取该工程的概况,根据用户对应该工程的操作状态进行响应。
      • 更新缓存数据。
    • 若不能找到工程,则通知前台可进入项目操作页(针对打开程序时,直接进入项目操作页)。
  • 触发离开围栏操作时
    • 等待60秒后执行以下操作,防止边界上因为GPS不准确导致提醒不准确。
    • 根据地理围栏标识,在本地SQLite数据库中查找缓存中的工程。
    • 若能找到工程,则进行以下操作
      • 查看设备是否处于该工程下的其他地理围栏中(针对工程多区域现象)。
      • 如果设备不处于工程的地理围栏中。则在后台进行「签退」操作。
      • 更新缓存数据。