使用Xcode + Python進行IOS運動軌跡模擬


前言

在某些app中,需要根據用戶的實時位置來完成某些事件

例如跑步打卡軟件(步道樂跑)、考勤打卡軟件(叮叮)、某些基於實時位置的游戲(Pokemon Go、一起來捉妖)

一般解決辦法是通過使用安卓模擬器,通過改變模擬器的位置屬性來實現模擬位置

但是某些軟件會通過比對常用設備的uuid,設備序列號等

一旦出現不匹配或者無法識別就可能會被列為懷疑對象,且安卓模擬器較難實現連續的擬人化的路徑

因此,為了減少被判定作弊的可能,只能通過在常用設備上連續的改變實時位置來模擬跑步行為

 

硬件環境:

    MacBook Pro (15-inch, 2017)

    iPhone 8 Plus

軟件環境:

    macOS Mojave 10.14.5

    iOS 12.4

    Xcode 10.2.1

    Python 3.7.0

    sublime text 3.1.1

 

具體步驟

1.使用Xcode創建一個IOS項目

打開Xcode -> Preferences 添加Apple ID

          

在Xcode上創建新項目

打開Xcode -> create a new Xcode project

選擇ios菜單 -> Single View App

填寫項目名 推薦非中文

在事先准備好的文件夾內存放 文件夾推薦非中文

        

       

此時將iPhone連接mac 左上角顯示連接設備

出現如下結果即為成功:

 

 

2.使用Xcode創建一個含有gpx的文件

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來依次定為每一個點來模擬人的跑動行為

 

3.使用Python來自動生成一系列軌跡點

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項目目錄內找到並打開該文件:

 

 

4.開始位置模擬

確保手機連接上電腦,並解鎖保持屏幕常亮

點擊Xcode右上角開始圖標:

 

第一次會提示iPhone未信任開發者

在設置 -> 通用 -> 設備管理 點擊該開發者並選擇信任

再次在Xcode上點擊右上角圖標

一分鍾左右手機上會多出一個灰色的app圖標

點擊后按home鍵退出,進入步道樂跑

在Xcode下方多出一欄功能,點擊位置圖標並選擇你的fake_loc

 

此時APP就已經按照gpx文件內的路徑開始移動了

 

 

 

 

 

5.總結

在模擬時沒有考慮速度的因素,按照默認的Xcode對gpx的點的更新速度來實現的

在控制整體的移動速度時完全是按照點的密集程度,即點的位置變化程度來實現的

后期可以根據時間標簽<time>來改進獲得更精確的速度

 

根據步道樂跑后台數據,檢測作弊主要依靠平均配速、每公里的步數、設備uuid、設備序列號來檢測的

文章的方法可以解決平均配速、uudi、序列號等問題(因為就是使用真機來實現的)

但是對於步數只能依靠在模擬時通過搖晃手機來實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM