iOS实现虚拟定位的多种玩法

13,209 阅读3分钟

Xcode Simulate Location

苹果为开发者提供的在调试模式下,可模拟定位的功能,方便开发者进行地图定位类APP的功能调试。我们可借助此功能实现虚拟定位,具体步骤如下:

  1. 打开Xcode创建一个新工程,插上手机直接运行。在菜单栏选择Debug - Simulate Location
    可以见到已预置了几个常用的模拟地址,我们直接试试选择Lodon,England。这个时候直接点Home键返回手机桌面,试试微信、百度地图等等APP发现当前定位已模拟成伦敦了。
  2. 我们可以看到最后一项有一个Add GPX File to Project,我们可以通过导入gpx文件实现自定义模拟定位。
  3. 接下来我们创建一个gpx文件,菜单栏-File-New-File..,
    文件名随便,我这里使用了默认的Location名称,接下来打开gpx文件如下:
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
    
    <!--
     Provide one or more waypoints containing a latitude/longitude pair. If you provide one
     waypoint, Xcode will simulate that specific location. If you provide multiple waypoints,
     Xcode will simulate a route visiting each waypoint.
     -->
    <wpt lat="37.331705" lon="-122.030237">
        <name>Cupertino</name>
        
        <!--
         Optionally provide a time element for each waypoint. Xcode will interpolate movement
         at a rate of speed based on the time elapsed between each waypoint. If you do not provide
         a time element, then Xcode will use a fixed rate of speed.
         
         Waypoints must be sorted by time in ascending order.
         -->
        <time>2014-09-24T14:55:37Z</time>
    </wpt>
    
</gpx>

<wpt lat="37.331705" lon="-122.030237"> 这行即经纬度数据,这里可以直接修改成你想要模拟定位的经纬度,网上有很多网站可以获取某个地点的经纬度,这里大家自己去查找就行了,然后在Simulate Location中选择我们gpx的文件名,我这里的名称是Location,点击后即可模拟定位到所在地址。

断开手机连接线,本次的模拟定位仍然生效。关闭我们创建的工程运行的APP进程,即可恢复真实定位。想要再次模拟定位,需要重新连接手机,使用Xcode运行工程,进行Simulate Location

基于此技术的有趣第三方库

github.com/kahopoon/Po…

使用node.js、脚本实现可视化实时修改gpx文件并生效

libimobiledevice

一个跨平台的“沟通”iOS设备的库。地址:github.com/libimobiled… 安装此命令行工具后,可使用命令行获取设备信息、查看日志、安装ipa、关机、重启等操作。很多iOS助手例如PP助手、iTools、爱思助手等都基于此库实现的。

推荐两个Mac端的iOS设备管理工具

  1. www.thinkskysoft.com/itools/ 提供虚拟定位、路线等。订购类APP
  2. www.i4.cn/ 爱思助手,提供虚拟定位,免费

这两个工具实现虚拟定位的原理:

前面我们使用的Simulate Location功能,原理是调用iOS设备中的com.apple.dt.simulatelocation服务,我们可以通过libimobiledevice的service模块开启com.apple.dt.simulatelocation服务来实现脱离通过Xcode来模拟定位。这里找到网上一篇专门分析此方法的文章,www.secpulse.com/archives/76… 他里面讲到大致实现的代码如下

这里还有个第三方库基于libimobiledevice对模拟定位服务的封装,使用更简单。 github.com/JonGabilond…

此库中基于libimobiledevice开启iOS设备模拟定位的关键代码

if ((lockdownd_start_service(client, "com.apple.dt.simulatelocation",  &service) != LOCKDOWN_E_SUCCESS) || !service) {

github.com/JonGabilond…