因为App面向的用户为国外用户,所以想在测试时尽量模拟真实用户的位置信息。需要使手机定位的经纬度在国外,然后使用系统API获取到经纬度,再使用系统API进行逆地理编码,以获取详细的位置信息。
例如,我想要模拟定位的经纬度为:-122.030237,37.331705
,然后获取的详细位置信息为:United States CA Cupertino
。
要想实现我的调试目标,需要以下三步:
一、使用Xcode模拟iOS设备的位置;
二、更改地图服务;
三、通过逆地理编码来获取位置信息;
1. 使用Xcode来模拟iOS设备的位置
1.1 准备 gpx 文件
- 新建文件;
- 选择新建文件类型, “
iOS
“选项下的”GPX File
”;- 创建 gpx 文件;
- 确定 gpx 文件中您想要模拟地点的经纬度;
具体操作步骤如下:
新建文件 --> 文件类型 --> 创建文件
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>
其中,lat="37.331705"
为纬度值,lon="-122.030237"
为经度值。经纬度的值可在 经纬度坐标拾取 中获取,选择你想要模拟的位置,然后复制经纬度数值,填写到gpx文件的lat=
,lon=
位置即可,注意:纬度在前,经度在后。
1.2 gpx文件的使用
在调试App运行起来后,勾选要模拟的位置,勾选后,您在App中获取到的经纬度即为您想要模拟位置的经纬度了。如下图:
以上这种勾选方式需要在调试App每次运行起来后,都勾选一下,有点麻烦。裤裆里冒烟,当然啦😄,有另外一种简单的方式,那就是设置默认的模拟位置,把您想要模拟的位置设置为默认模拟位置就行了。这样,调试App每次运行起来后都会选择您的模拟位置,不用每次都去勾选一下,非常方便。设置方式:在Xcode
的Edit Scheme
中进行设置,如下图:
1.3 模拟位置后的效果
在iPhone真机上把调试App运行起来,并设置模拟位置后,你的iPhone真机定位位置就是你设置的模拟位置了,结果如下:
你也可以打开百度地图、高德地图等地图App,查看你当前的位置,可以看到同样为:Cupertino - 库比蒂诺,这样你就可以随意模拟你想要的定位位置了😎。
2. 更改地图服务
由于Apple在中国使用的是高德的地图服务,所以我们使用系统API进行逆地理编码国外的经纬度时获取不到位置信息,因此我们还需要把地图服务改为Apple在国外的地图服务。
2.1 更改地图服务
操作步骤:
- 关闭 蜂窝移动数据;
- 打开 无线局域网,连接一个WiFi;
- 打开 飞行模式;
- 打开 VPN 360 或其他VPN应用,连接VPN;
- 杀掉Apple自带的“地图”应用;
- 重新打开Apple自带的“地图”应用,可以看到地图应用界面中的“高德地图”logo不见了。
2.2 更改后的效果对比图
- 使用高德的地图服务时
- 使用Apple在国外的地图服务时
3. 通过逆地理编码获取位置信息
- 准备一个demo项目,导入您想要模拟定位的
gpx
文件,并在Xcode
的Edit Scheme
中设置为默认模拟位置; - 运行demo项目到您使用的调试真机上,运行成功后,调试真机的定位位置就是您想要模拟定位的位置了;
- 再打开您真正想要测试的App(不要停止第二步运行的demo项目),则在该App中获取的经纬度就是您模拟的定位位置的经纬度,然后利用系统API逆地理编码出来的位置也是您模拟定位的位置信息。
我的测试中,想要模拟定位位置的经纬度为:
-122.030237,37.331705
,最后获取的详细位置信息为:United States CA Cupertino
。