透過 pymobiledevice3 在 Mac 上模擬 iPhone 的 GPS 定位。
- macOS(Apple Silicon 或 Intel)
- iPhone 透過 USB 連接至 Mac
- iOS 17+ 需開啟開發者模式(設定 > 隱私權與安全性 > 開發者模式)
按 Cmd + Space 搜尋「終端機」或「Terminal」並開啟。
cd /path/to/LocationScript將 /path/to/LocationScript 替換為資料夾實際所在的路徑。也可以輸入 cd 後直接把資料夾拖進終端機視窗。
chmod +x install.sh./install.sh安裝腳本會自動檢查並安裝以下依賴:
- Homebrew
- Python 3
- Tkinter
- pipx
- pymobiledevice3
安裝完成後會在資料夾內產生 iOS虛擬定位.app。
如無法啟用 app,請在終端機輸入 python3 app.py(資料夾路徑需正確)。
更新程式碼後重新打包:若修改了
app.py,可執行./build.sh重新產生 .app,不需重新執行install.sh。
用 USB 線將 iPhone 連接到 Mac,並在 iPhone 上點選「信任此電腦」。
雙擊 iOS虛擬定位.app 啟動。
點擊「啟動」按鈕,會開啟 Terminal 並要求輸入 Mac 的登入密碼(sudo 權限)。
有四種方式輸入座標:
- 手動輸入:直接在緯度、經度欄位輸入座標
- Google Maps 網址:貼上瀏覽器的 Google Maps 網址後點「解析」自動擷取座標(注意:搜尋列有值可能影響結果)
- 座標字串:貼上
緯度,經度格式的字串後點「解析」 - 收藏地點:從已收藏的地點中選擇
- 座標清單:載入 JSON 檔案,點選清單中的項目即立即前往該座標
- 清單編輯器:點擊「✏️ 編輯清單」開啟編輯器,貼上多筆座標後解析並套用到主視窗
輸入完成後點擊「設定位置」即可。定位成功後會在下方自動顯示該座標對應的地址名稱(需要網路)。若座標落在海洋或荒地,也會顯示警告。
定位設定後每 10 秒自動重送一次定位指令,防止 iOS 自動跳回真實位置。點擊「清除」後才會停止重送。
點擊「清除」按鈕。清除後需重新開啟地圖 App 才會恢復真實定位。 如果沒辦法恢復,請使用飛航模式,開啟後關閉。
點擊右側面板的「✏️ 編輯清單」開啟編輯器視窗:
- 在上方文字框貼上多筆座標,每行一筆,支援以下格式:
以
25.033,121.565 25.040 121.570 台北車站 25.047924 121.517081#開頭的行會當作註解忽略。 - 設定「預設停留秒數」(巡邏時每個地點的停留時間,預設 60 秒)
- 點「✅ 解析並載入」確認解析結果
- 點「✅ 套用到主視窗」將清單套用到右側面板(或「💾 儲存 JSON」存成檔案以便日後載入)
解析座標後,可使用以下三種算法自動排列巡邏順序。設定好路線後再套用到主視窗。
速度欄:輸入實際巡邏時速(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 改良(開放路徑版),取總距離最短者
- 建議巡邏模式:單次
載入或套用座標清單後,右側面板下方會出現巡邏控制列:
- ▶ 巡邏:從目前選取的地點開始,依序自動切換定位
- ⏸ 暫停 / ▶ 繼續:暫停或繼續巡邏(移動中與停留中皆可暫停)
- ⏹ 停止:立即停止巡邏
速度設定(巡邏按鈕下方):
- 設定移動時速(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 秒
- 物件格式(與
- 手動設定的定位紀錄會寫入歷史紀錄,巡邏切換不計入
腳本版(python3 app.py) |
封裝版(.app) | |
|---|---|---|
收藏地點 (favorites.json) |
專案資料夾內 | ~/Library/Application Support/iOS虛擬定位/ |
歷史紀錄 (history/) |
專案資料夾內 | ~/Library/Application Support/iOS虛擬定位/history/ |
| 重新打包 | 不需要 | 修改 app.py 後執行 ./build.sh |