Skip to content

GPS Mock

Chason Tang edited this page Jun 9, 2022 · 5 revisions

题目一:DoKit 路径模拟(iOS)

背景介绍

作为出行类业务为主的公司,地图导航是必需的功能,因此不可避免需要在业务开发,测试,甚至上线过程中,对地图导航相关的业务进行功能测试和业务收益的测试,而当前现状是,要进行这类测试,都需要到户外进行真实发单路测,费事费力,而且效果也不好,所需要复现的场景很可能是非必现的,复现完全靠天意和反复测试,开发,测试,业务方的成本急剧增加:

  1. 必须要上路进行测试,测试方法单一且低效。
  2. 问题场景难复现,复现流程复杂,无法有效发现问题。
  3. 测试需要投入的人力成本大。
  4. 真实上路,可能造成不安全因素。

功能要求

位置模拟整体分两个模块:单点位置模拟和轨迹模拟。二者的功能开启是互斥关系,也就是说,同一时刻,只允许单点位置模拟或轨迹模拟,且在轨迹模拟过程还未结束前,不允许开启位置模拟。

单点位置模拟

单点位置模拟是提供当前位置模拟的能力,使用场景如开城城市定位模拟,真实导航过程中单点漂移模拟等。

  1. 输入精确的经纬度坐标进行模拟 业务方在 DoKit 位置模拟功能里的输入框里输入精确的经纬度坐标,再点击 开始模拟 按钮,即可实现单点位置的模拟。 fishhook

  2. 通过拖动地图,选择坐标进行模拟 为了提供更简便的坐标选择方式,允许业务方通过内嵌的地图选择模拟坐标点,用户可以通过拖动地图,实现自定义坐标点的模拟,当用户选择了坐标点后,该坐标点的经纬度可以回显到(1)处的输入框中,用户再点击 开始模拟 按钮即可实现当前位置的模拟。

轨迹模拟

轨迹模拟是指模拟业务方与路线轨迹相关的操作,例如接、发单路径导航模拟,业务方可以不用再开车出去进行路测,只需要用轨迹模拟功能,在办公室即可模拟真实场景下的路径导航功能,同时还需要提供业务真实场景下的异常事件的模拟,例如路径导航过程中因丢星、隧道、高架等场景下的坐标漂移模拟等。

  1. 轨迹导航模拟
  • 通过hook业务方发起的路径轨迹的回调方法,从而拿到业务方选定的轨迹路线,并把起终点回填到输入框中,然后根据设定的速度,开启轨迹模拟。
  • 当业务方未发起路径轨迹即开始导航,例如代驾司机端未设定目标地址,并开始指路行驶的场景下,可以在起点和终点输入框中分别输入起点和终点,来模拟指路驾驶的场景。此时用到的是地图的定位模拟功能,DoKit Hook 业务方的定位回调接口,将轨迹点回调给业务方。
  1. 漂移模拟设置(可选) 漂移模拟不是必需选项,如果业务方没有模拟漂移的需要,可以选择不开启漂移模拟。

漂移类型分随机漂移和路径漂移。

  • 随机漂移:即模拟漂移的轨迹点完全随机,无规则,因此可能形成的漂移轨迹也是无规则的,可能出现锯齿状的模拟轨迹。
  • 路径漂移:即模拟漂移的轨迹相对于真实轨迹,形状和路线方向基本近似,相当于是在真实轨迹的基础上整体挪动了一定的距离,漂移的轨迹点不是完全随机的。 漂移范围指的是以真实轨迹点为圆心,漂移范围为半径的圆内随机生成一个漂移点,作为当前该真实轨迹点的模拟漂移点。可以用来限定漂移轨迹点的可漂移最大范围,单位是米。

漂移模式分智能模式和手动模式。

  • 智能模式:指的是通过拿到hook的规划路径信息,分析信息里的路径片段的道路信息,得到处于隧道,高架等路段的轨迹,从而在这些特定路段的轨迹进行自动漂移模拟。
  • 手动模式:指的是可以通过滑块,来选择在哪段范围的路径上进行模拟漂移,整个真实轨迹设定为 1, 滑块选定的起始和终点,分别是位于整段路径的百分比位置,也就是说从整段真实轨迹的起点百分比开始漂移模拟,在终点百分比停止漂移。
  1. 地图预览 DoKit在位置模拟界面内置了预览地图(百度地图),用户在进行单点模拟或轨迹模拟时,真实和模拟的轨迹点或路径轨迹可以在该地图上实时呈现,例如轨迹模拟,在预览地图上可以显示路径轨迹,并显示实时的模拟定位
  • 展示当前模拟定位的位置。
  • 拖动地图选择模拟坐标。
  • 轨迹模拟时(未开启漂移),展示真实轨迹,以及当前导航所在位置。
  • 轨迹模拟时(开启漂移),展示真实轨迹,并且展示模拟漂移的轨迹,以及当前导航所在的位置,并在以该位置为圆心,以漂移范围为半径的圆。

技术要求

  1. Objective-C runtime 了解,对基于 runtime Hook 了解
  2. C++ 动态库 PLT Hook 了解

参考资料

fishhook