未越狱 iOS 设备通过 Xcode 修改 GPS 定位信息。
0x01. GPS 坐标简介
GPS 坐标使用经纬度来表示,有几种不同的规范:
- WGS-84,World Geodetic System,定义于 1984 年,最后修改定于 2004 年,是被 GPS 所使用的国际规范
- GCJ-02,国测局坐标系、火星坐标系,基于 WGS-84 但是会在经纬度中加入看似随机的偏移
- BD-09,百度坐标系,在 GCJ-02 的基础上增加了一次变换
《中华人民共和国测绘法》要求地图提供商使用 GCJ-02 坐标系统:
使用 GCJ-02 记录下的地点在 GCJ-02 的地图中会显示在正确位置,然而换成 WGS-84 的地图或地点记录就可能造成 100 - 700 米不等的偏移。据测量,Google.com 的地图与真实坐标相差约 50 - 500 米,而中国区的 Google.cn 地图则与卫星图无偏差
实际测试发现 Google.cn 迁移到 Google.com.hk 之后,使用的是 WGS-84 坐标系,其卫星图与地图存在一定的偏移:
0x02. Xcode 真机调试
在 Xcode 中新建一个 iOS App,并在 iOS Deployment Target 设置好对应的系统版本。
首次在 iPhone 上调试,会提示如下错误:
1 | Could not launch “PhoneDemo” |
在 iPhone 的设置里面信任对应的开发者即可。
0x03. GPS 位置模拟
- 通过 高德地图 API 获取目标位置的 GCJ-02 坐标,比如“深圳市腾讯大厦”的坐标为
113.934497,22.540517
- 通过 转换工具 将坐标转换为 WGS-84 坐标,这里转换后为
113.92962958,22.54354674
- 在 iOS App 工程中新建一个 location.gpx 文件并设置好 WGS-84 经纬度坐标
1 | <?xml version="1.0" encoding="UTF-8" ?> |
此时,需要修改 iOS App 工程设置,选择 Edit Scheme...
,在 Run - Options - Core Location 中选中 Allow Location Simulation,其中 Default Location 选中前面添加的 gpx 文件。
在连接的 iPhone 上运行该 iOS App,即可临时修改 GPS 位置信息。
当然,这种模拟 GPS 位置的方法弊端也很明显,之前看到有人在 HITB 上讲过 PhantomGPS,相对来说方便和灵活了很多,二代售价 400 块。