Skip to content

ar36planet/LocationScript

Repository files navigation

iOS 虛擬定位工具

透過 pymobiledevice3 在 Mac 上模擬 iPhone 的 GPS 定位。

系統需求

  • macOS(Apple Silicon 或 Intel)
  • iPhone 透過 USB 連接至 Mac
  • iOS 17+ 需開啟開發者模式(設定 > 隱私權與安全性 > 開發者模式)

安裝步驟

1. 開啟終端機

Cmd + Space 搜尋「終端機」或「Terminal」並開啟。

2. 切換到資料夾目錄

cd /path/to/LocationScript

/path/to/LocationScript 替換為資料夾實際所在的路徑。也可以輸入 cd 後直接把資料夾拖進終端機視窗。

3. 允許執行安裝腳本

chmod +x install.sh

4. 執行安裝

./install.sh

安裝腳本會自動檢查並安裝以下依賴:

  • Homebrew
  • Python 3
  • Tkinter
  • pipx
  • pymobiledevice3

安裝完成後會在資料夾內產生 iOS虛擬定位.app。 如無法啟用 app,請在終端機輸入 python3 app.py(資料夾路徑需正確)。

更新程式碼後重新打包:若修改了 app.py,可執行 ./build.sh 重新產生 .app,不需重新執行 install.sh

使用方式

1. 連接 iPhone

用 USB 線將 iPhone 連接到 Mac,並在 iPhone 上點選「信任此電腦」。

2. 開啟程式

雙擊 iOS虛擬定位.app 啟動。

3. 啟動 Tunnel(iOS 17+ 必須)

點擊「啟動」按鈕,會開啟 Terminal 並要求輸入 Mac 的登入密碼(sudo 權限)。

4. 設定虛擬定位

有四種方式輸入座標:

  • 手動輸入:直接在緯度、經度欄位輸入座標
  • Google Maps 網址:貼上瀏覽器的 Google Maps 網址後點「解析」自動擷取座標(注意:搜尋列有值可能影響結果)
  • 座標字串:貼上 緯度,經度 格式的字串後點「解析」
  • 收藏地點:從已收藏的地點中選擇
  • 座標清單:載入 JSON 檔案,點選清單中的項目即立即前往該座標
  • 清單編輯器:點擊「✏️ 編輯清單」開啟編輯器,貼上多筆座標後解析並套用到主視窗

輸入完成後點擊「設定位置」即可。定位成功後會在下方自動顯示該座標對應的地址名稱(需要網路)。若座標落在海洋或荒地,也會顯示警告。

定位設定後每 10 秒自動重送一次定位指令,防止 iOS 自動跳回真實位置。點擊「清除」後才會停止重送。

5. 清除虛擬定位

點擊「清除」按鈕。清除後需重新開啟地圖 App 才會恢復真實定位。 如果沒辦法恢復,請使用飛航模式,開啟後關閉。

6. 清單編輯器(批量輸入座標)

點擊右側面板的「✏️ 編輯清單」開啟編輯器視窗:

  1. 在上方文字框貼上多筆座標,每行一筆,支援以下格式:
    25.033,121.565
    25.040 121.570
    台北車站 25.047924 121.517081
    
    # 開頭的行會當作註解忽略。
  2. 設定「預設停留秒數」(巡邏時每個地點的停留時間,預設 60 秒)
  3. 點「✅ 解析並載入」確認解析結果
  4. 點「✅ 套用到主視窗」將清單套用到右側面板(或「💾 儲存 JSON」存成檔案以便日後載入)

7. 路線規劃(清單編輯器內)

解析座標後,可使用以下三種算法自動排列巡邏順序。設定好路線後再套用到主視窗。

速度欄:輸入實際巡邏時速(km/h),用於計算預估時間與時間限制判斷。


🌸 規劃最佳路線(種花模式)

適用情境:在有效時間內最大化經過的花點數(如 Pokémon GO 種花)。

  • 路徑類型:封閉循環(自動回起點)
  • 有效範圍:每個花點以半徑 40 公尺為有效圓,路線經過圓內即計入
  • 限制:5 分鐘內不可走重複路徑(線段相交或重疊視為重複)
  • 算法:對每個起點執行貪婪最近鄰 + 2-opt 改良,取覆蓋花點最多、距離最短者
  • 建議巡邏模式:循環

若總距離超過 5 分鐘限制或路線仍有交叉,會顯示警告。


🔄 外圈巡邏(種花模式)

適用情境:沿所有花點的外圍邊界繞行,形成大橢圓或圓角多邊形路線。

  • 路徑類型:封閉循環
  • 做法:計算花點的凸包,對每個頂點生成圓弧,直段連接相鄰弧端點
  • 安全半徑自動計算:為確保直線段中點也在有效範圍內,軌道半徑會依花點間距自動縮減: 安全半徑 = √(40² − (最長相鄰間距 / 2)²)
  • 注意:凸包內部的花點若距邊緣超過 40 公尺,不會被路線覆蓋;花點間距 ≥ 80m 時圓不相交,無法建立軌道
  • 輸出:產生新的 WP01、WP02… 路徑點(取代原有清單),彈窗顯示實際安全半徑
  • 建議巡邏模式:循環
花點數量 路線形狀
1 個 圓形
2 個 橢圓(體育場形)
3 個 圓角三角形
4 個以上 圓角多邊形
花點最大間距 安全半徑
20m ≈ 34.6m
40m ≈ 28.3m
60m ≈ 26.5m
≥ 80m 無法建立(顯示錯誤)

🍎 種果路線(種果模式)

適用情境:以最短總距離單向依序經過所有座標(如採集果實)。

  • 路徑類型:開放單向(不回起點)
  • 無時間限制,無交叉限制
  • 算法:對每個起點執行貪婪最近鄰 + 2-opt 改良(開放路徑版),取總距離最短者
  • 建議巡邏模式:單次

8. 自動巡邏

載入或套用座標清單後,右側面板下方會出現巡邏控制列:

  • ▶ 巡邏:從目前選取的地點開始,依序自動切換定位
  • ⏸ 暫停 / ▶ 繼續:暫停或繼續巡邏(移動中與停留中皆可暫停)
  • ⏹ 停止:立即停止巡邏

速度設定(巡邏按鈕下方):

  • 設定移動時速(km/h)。設為 0 則點與點之間瞬間跳點,不模擬移動
  • 設為大於 0 時,巡邏會以線性插值在點與點之間逐步移動,每 5 秒更新一次位置
  • 移動中狀態列會顯示「🚶 → 目的地名 剩餘距離」;抵達後開始停留倒數

巡邏模式(與速度設定同排):

模式 行為
循環 A → B → C → A → B → C … 無限重複
來回 A → B → C → B → A → B → C … 無限來回,端點只停留一次
單次 A → B → C 走完即停止,顯示「巡邏完成」

注意:巡邏進行中不可點選或用鍵盤切換清單(避免誤觸中斷行程)。每個地點的停留秒數由清單中 dwell 欄位決定(透過編輯器設定),移動時間與停留時間分開計算。巡邏切換不寫入歷史紀錄,且不查詢地址名稱(避免重複呼叫 API)。

注意事項

  • 首次執行 .app 時,macOS 可能會提示「無法打開」,請到「系統設定 > 隱私權與安全性」允許執行
  • 關閉程式時會詢問是否同時停止 Tunnel
  • 座標清單支援兩種 JSON 格式:
    • 物件格式(與 favorites.json 相同):{"地點名稱": {"lat": "...", "lng": "..."}}
    • 陣列格式:[{"name": "地點名稱", "lat": "...", "lng": "...", "dwell": 60}],無 name 時自動以座標顯示,無 dwell 時預設 60 秒
  • 手動設定的定位紀錄會寫入歷史紀錄,巡邏切換不計入

封裝版(.app)與腳本版的差異

腳本版(python3 app.py 封裝版(.app)
收藏地點 (favorites.json) 專案資料夾內 ~/Library/Application Support/iOS虛擬定位/
歷史紀錄 (history/) 專案資料夾內 ~/Library/Application Support/iOS虛擬定位/history/
重新打包 不需要 修改 app.py 後執行 ./build.sh