前言python
在某些app中,须要根据用户的实时位置来完成某些事件ios
例如跑步打卡软件(步道乐跑)、考勤打卡软件(叮叮)、某些基于实时位置的游戏(Pokemon Go、一块儿来捉妖)xcode
通常解决办法是经过使用安卓模拟器,经过改变模拟器的位置属性来实现模拟位置app
可是某些软件会经过比对经常使用设备的uuid,设备序列号等dom
一旦出现不匹配或者没法识别就可能会被列为怀疑对象,且安卓模拟器较难实现连续的拟人化的路径网站
所以,为了减小被断定做弊的可能,只能经过在经常使用设备上连续的改变实时位置来模拟跑步行为ui
MacBook Pro (15-inch, 2017)spa
iPhone 8 Plus设计
macOS Mojave 10.14.5code
iOS 12.4
Xcode 10.2.1
Python 3.7.0
sublime text 3.1.1
打开Xcode -> Preferences 添加Apple ID
在Xcode上建立新项目
打开Xcode -> create a new Xcode project
选择ios菜单 -> Single View App
填写项目名 推荐非中文
在事先准备好的文件夹内存放 文件夹推荐非中文
此时将iPhone链接mac 左上角显示链接设备
出现以下结果即为成功:
GPX(GPS eXchange Format,GPS交换格式)是一个XML格式,为应用软件设计的通用GPS数据格式,专门用来存储地理信息
一个GPX文件内包含一些经纬度点组成的轨迹,包含了时间、名字等信息
回到Xcode 打开Xcode -> File -> New -> File...
在IOS菜单下选择GPX File
选择一个位置并命名GPX文件 例:fake_loc.gpx
自动生成以下gpx文件即为成功
分析该gpx文件,格式相似标签语言风格
在<wpt>标签内包含经纬度(lat、lon)、该点名称以及时间
第一段注释内容大意为:
“提供一个或多个包含纬度/经度对的点
若是提供一个点,Xcode将模拟那个特定的点
若是提供多个点,Xcode将依次模拟每个点”
第二段注释内容大意为:
“能够选择为每个坐标点添加一个时间标签可,Xcode能够根据时间标签的顺序依次移动到每个坐标点,并根据时间点来插入速度X
若是不提供一个时间标签,那么Xcode将使用一个固定的速度
航路点必须按时间升序排序”
所以,能够经过输入一系列点来模拟位置,让Xcode来依次定为每个点来模拟人的跑动行为
mac下python与sublime text3的环境配置在第一篇随笔中有记录
分析gpx文件结构能够获得目标gpx文件结构应该为:
<?xml version="1.0"?> <gpx version="1.1" creator="Xcode"> <wpt lat="坐标点经度1" lon="坐标点纬度1"> </wpt> <wpt lat="坐标点经度2" lon="坐标点纬度2"> </wpt> <wpt lat="坐标点经度3" lon="坐标点纬度3"> </wpt> #...... #以此类推 </gpx>
在地图经纬度查询网站能够获得指定地点的经纬度信息:http://www.gpsspg.com/maps.htm
咱们选择西安市某211高校做为实验地点:
该网站提供多个公司的定位标准下的经纬度信息
因为每一家公司的定位标准不一样,经纬度就会存在误差,这时候就要看用来模拟的APP使用哪家的地图了
咱们以某跑步打卡APP 步道乐跑 做为实验对象
在该高校实现水平移动与竖直移动
通过验证该APP使用的是 谷歌地球标准
经过该网站首先获得一段直线的首尾经纬度点:
开始点:
lat:34.3752989239
lon:108.9080291565
中间点:
lat:34.3740193255
lon:108.9085977848
结束点:
lat:34.3733728774
lon:108.9064091023
在该网站能够经过经纬度得到距离信息:http://www.hhlink.com/经纬度/
计算获得距离约为78米
后续可根据需求,经过测距来获得相应距离 从而计算获得水平与竖直移动速度
能够得出结论:
在该高校相对从北到南 经度减小,纬度增长
在该高校相对从东到西 经度减少,纬度减少
在符合跑步打卡APP步道乐跑的配速要求:3~9 min/km
例如从北到南生成100个点
经度依次减小 纬度依次增长,并使得这100个点散布在路径上
每一个点之间减小或者增长的距离能够经过乘以指定范围内的随机数,使得点之间呈现左右略为摇摆的路径
在点数量较多的状况下近似为人的跑动轨迹
根据该高校的位置状况编写相应的python程序:
import random #初始点信息 a1 = 34.3752989239; b1 = 108.9080291565; #中间点信息 a2 = 34.3740193255; b2 = 108.9085977848; for i in range( 1,1000 ): while( a1 >= a2 ): # 循环条件 经度未到达中间点时执行 xa = round( random.uniform(0.2, 7) ) # 随机数,用于模拟人跑动 xb = round( random.uniform(12, 15) ) # 竖直移动 a1 = round( a1 - 0.0000072 * xa , 10 ) b1 = round( b1 + 0.0000008 * xb , 10 ) # 输出信息 print( '<wpt lat="' + str( a1 ) + '"' + ' ' + 'lon="' + str( b1 ) + '">' ) print( '</wpt>' ) for i in range( 1,1000 ): xa = round( random.uniform(2, 8) ) xb = round( random.uniform(1, 3) ) # 水平移动 a2 = round( a2 - 0.000003 * xa, 10 ) b2 = round( b2 - 0.000025 * xb, 10 ) print( '<wpt lat="' + str( a2 ) + '"' + ' ' + 'lon="' + str( b2 ) + '">' ) print( '</wpt>' )
获得输出(节选):
将该输出复制并粘贴在gpx文件里
并 command + s 保存
能够在xcode项目目录内找到并打开该文件:
确保手机链接上电脑,并解锁保持屏幕常亮
点击Xcode右上角开始图标:
第一次会提示iPhone未信任开发者
在设置 -> 通用 -> 设备管理 点击该开发者并选择信任
再次在Xcode上点击右上角图标
一分钟左右手机上会多出一个灰色的app图标
点击后按home键退出,进入步道乐跑
在Xcode下方多出一栏功能,点击位置图标并选择你的fake_loc
此时APP就已经按照gpx文件内的路径开始移动了