且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

更新时间:2022-05-20 12:12:47

前言

修改方式:

1、通过GPX文件修改经纬度信息 2、直接hook CLLocation修改定位 (iOS逆向)

应用场景1:

在开发测试时尽量模拟真实用户的位置信息。为了测试方便,直接使用代码修改经纬度,而不用真的的去到对应的地方

应用场景2:打卡

I、通过GPX文件修改经纬度信息

例子:修改经纬度,逆地理编码来获取位置信息 

然后使用系统API获取到经纬度,再使用系统API进行逆地理编码,以获取详细的位置信息。例如,我想要模拟定位的经纬度为:-122.030237,37.331705,然后获取的详细位置信息为:United States CA Cupertino。

步骤:

  1. 使用Xcode模拟iOS设备的位置:通过GPX文件修改定位
  2. 更改地图服务
  3. 通过逆地理编码来获取位置信息;

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

1.1   准备gpx 文件( “iOS“选项下的”GPX File”)

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

虚拟坐标的获取之前,先了解下坐标系,以便进行转换

  1. iOS,原生坐标系为 WGS-84
  2. 高德以及国内坐标系:GCS-02https://lbs.amap.com/console/show/picker
  3. 百度的偏移坐标系:BD-09
  • 例子
<gpx version="1.1"
    creator="GMapToGPX 6.4j - http://www.elsewhere.org/GMapToGPX/"
    xmlns="http://www.topografix.com/GPX/1/1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
    <wpt lat="31.255713422688655" lon="121.51010557702513">
        <cmt>北外滩</cmt>
</gpx>

1.2 gpx文件的使用

在调试App运行起来后,勾选要模拟的位置

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

  • 效果

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

1.3  更改地图服务【可选】

由于Apple在中国使用的是高德的地图服务,所以我们使用系统API进行逆地理编码国外的经纬度时获取不到位置信息,因此我们还需要把地图服务改为Apple在国外的地图服务。

  • 操作步骤:

关闭 蜂窝移动数据;打开 无线局域网,连接一个WiFi;打开 飞行模式;打开 (v _ p _n)app ;杀掉Apple自带的“地图”应用;

重新打开Apple自带的“地图”应用,可以看到地图应用界面中的“高德地图”logo不见了

1.4  通过逆地理编码来获取位置信息;

  • iOS平台开发高德SDK:定位AMapServices 及 Web服务 API :地理/逆地理编码geocodes的使用

iOS定位、地理/逆地理编码geocodes的使用、判断目标经纬度是否在大陆

iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)

//逆地理编码
@interface AMapReGeocode : AMapSearchObject

II、   直接hook CLLocation修改定位 (iOS逆向)

修改定_位; hook 原生API,直接替换为自己的即可

#import <CaptainHook/CaptainHook.h>
#import "WechatPodForm.h"
#import <UIKit/UIKit.h>
CHDeclareClass(CLLocation);
CHOptimizedMethod0(self, CLLocationCoordinate2D, CLLocation, coordinate){
    CLLocationCoordinate2D coordinate = CHSuper(0, CLLocation, coordinate);
    if(pluginConfig.location.longitude || pluginConfig.location.latitude ){
        coordinate = pluginConfig.location;
    }
    return coordinate;
}
CHConstructor{
    CHLoadLateClass(CLLocation);
    CHClassHook(0, CLLocation, coordinate);
}

III 、HTML5 地理定位

请查看原文:https://kunnan.blog.csdn.net/article/details/105145977

see also