Xcode Simulate Location
苹果为开发者提供的在调试模式下,可模拟定位的功能,方便开发者进行地图定位类APP的功能调试。我们可借助此功能实现虚拟定位,具体步骤如下:
- 打开Xcode创建一个新工程,插上手机直接运行。在菜单栏选择Debug - Simulate Location 可以见到已预置了几个常用的模拟地址,我们直接试试选择Lodon,England。这个时候直接点Home键返回手机桌面,试试微信、百度地图等等APP发现当前定位已模拟成伦敦了。
- 我们可以看到最后一项有一个Add GPX File to Project,我们可以通过导入gpx文件实现自定义模拟定位。
- 接下来我们创建一个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
基于此技术的有趣第三方库
使用node.js、脚本实现可视化实时修改gpx文件并生效
libimobiledevice
一个跨平台的“沟通”iOS设备的库。地址:github.com/libimobiled… 安装此命令行工具后,可使用命令行获取设备信息、查看日志、安装ipa、关机、重启等操作。很多iOS助手例如PP助手、iTools、爱思助手等都基于此库实现的。
推荐两个Mac端的iOS设备管理工具
- www.thinkskysoft.com/itools/ 提供虚拟定位、路线等。订购类APP
- 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) {