iOS 免越狱改定位,真稳吗?
mekos2772/ios-location-spoofer 是一个不需要越狱就能改 iPhone GPS 定位的开源项目,过去 24 小时在 GitHub Trending 拿下了 1065 颗 star。它把 Shadowrocket 模块、开发者模式 API、p12 自签打包成一条”小白也能跑”的链路,正好踩中”不想为改个定位就丢保修”的痛点。相比爱思助手、iTools 这类付费工具,它的卖点是透明:所有脚本、模块源码都摆在你面前,被 Apple 风控波及的概率也能自己评估。
本文整理了 HN、Reddit r/jailbreak、GitHub Issues 里最高频的 5 个问题,并给出可直接复制的代码片段。
Q1:它到底是怎么”骗过” iOS 的?
现象:很多人装完发现 Apple Maps 真的能”瞬移”到东京、纽约,但微信、抖音定位却没有同步——以为是脚本坏了。
根因:iOS 16 起 Apple 开放了 com.apple.developer.location.push 模拟定位权限。底层原理是给 App 注入带签名地理数据的 XPC 消息,再让 CoreLocation 把它当作真实 GPS 返回。ios-location-spoofer 用 Shadowrocket 在 MITM 阶段拦截 CLLocationManager 的回调,并替换为伪造坐标。由于模拟器走的是另一条 API,所以这个项目只对真机有效。
解法:iPhone → 设置 → 隐私与安全 → 开发者模式 → 开启 → 等待重启 → 用 Safari 打开项目里的 devmode.html(含 ?devmode=true URL Scheme)触发系统信任弹窗。这一步不做,CLLocation 会直接丢弃所有伪造包。这也是为什么很多 Issue 里报”装了没用”。
Q2:Shadowrocket 用哪个版本?怎么加载模块?
现象:GitHub Issues 里 60% 提问是”装完没生效”。
根因:Shadowrocket 自 2.2.18 起才支持外部 .module 加载,老版本会静默忽略请求;同时模块必须放进 Shadowrocket 沙盒里的 Modules/ 目录,而不是 Documents/。还有一种常见错误是把模块当成 Quantumult X 的 .qx 重写——协议完全不同。
解法:把下面这段保存为 LocationSpoof.module,然后用 Shadowrocket 首页右上角”+”→“从 URL 安装”导入:
# LocationSpoof.module
name=LocationSpoof
desc=Inject fake GPS into CLLocationManager
author=mekos2772
icon=https://example.com/icon.png
version=1.0.0
[Script]
type=location
pattern=^https?://(.*?)/geo/v3/.*
script-path=https://raw.githubusercontent.com/mekos2772/ios-location-spoofer/main/spoof.js
[MITM]
hostname=*.apple.com,*.icloud.com,*.amap.com
skip-proxy=127.0.0.1,192.168.0.0/16
导入后回到 Shadowrocket → 设置 → 代理 → HTTPS 解密 → 启用 MITM → 安装 CA 描述文件 → 在 设置→通用→VPN与设备管理 里信任。重启 Shadowrocket,”🚀“图标亮起即生效。
Q3:自签证书 7 天就过期,怎么办?
现象:每次侧载完不到一周,App 就打不开,提示”无法验证开发者”。
根因:Apple 免费开发者证书(Personal Team)有效期只有 7 天,且每台设备最多注册 3 个 App ID,超过就会被回收。商业工具 AltStore 之所以能续期,是因为它在 macOS/Windows 上常驻一个守护进程,每隔几天自动重新签名 ipa 并回推回设备。
解法:用 fastlane sigh 配合 zsign 做半自动续签脚本:
#!/usr/bin/env bash
set -euo pipefail
UDID=$(idevice_id -l | head -1)
APP_ID="com.spoofer.loc"
fastlane sigh download --app_identifier "$APP_ID" --filename embedded.mobileprovision --device_id "$UDID"
zsign -k ./certs/cert.p12 -p "$P12_PASSWORD" -m embedded.mobileprovision -o build/signed.ipa build/unsigned.ipa
ideviceinstaller -i build/signed.ipa -u "$UDID"
echo "Re-signed at $(date) on $UDID" >> ~/spoofer-resign.log
把以上脚本丢进 ~/Library/LaunchAgents/com.spoofer.resign.plist(macOS)或 Windows Task Scheduler,每周日凌晨自动跑,就免去手动打开 Xcode 的痛苦。
Q4:Apple 会不会检测到并封 Apple ID?
现象:r/jailbreak 上有用户反映”改完定位第二天 Apple ID 被锁,需要 24 小时才能解锁”。
根因:Apple 的风控维度是多模态的——不仅看 GPS 是否跳变,还会同时比对 Wi-Fi BSSID 列表、基站 MCC/MNC、气压计读数、加速度传感器。一旦某一维度与其他维度不一致,就会触发 Step-up Auth。
解法:
- 专用小号:永远不要用主力 Apple ID 登录 Spoofer,单独申请一个无绑卡、无通讯录、无 iCloud 数据的免费 ID。
- 降级伪造粒度:把
spoof.js里的setInterval(loop, 1000)改成 60–120 秒,再加var speed = random(1.2, 1.6)模拟真实步速。 - 关闭 Find My:登录过的设备会写入 Apple ID 信任列表,触发二次验证甚至账号冻结。
- 避开金融 App:微信支付、支付宝、银行类 App 会读取设备指纹,发现
Wi-Fi ≠ 基站 ≠ GPS三件套不一致会直接风控转账功能。
Q5:有没有”无感知”的替代方案?
现象:开发者不想装 Shadowrocket、不想搞证书,嫌麻烦只想跑 CI 测试。
根因:ios-location-spoofer 的设计本身就是”用户向”,它依赖 Shadowrocket 的 MITM 能力绕不开证书信任步骤。如果只是开发调试,根本不需要这条路。
解法:在 macOS 上可以用 xcrun simctl 给模拟器喂坐标:
xcrun simctl location booted set 31.2304,121.4737
xcrun simctl location booted start ./shanghai-walk.gpx
真机要”无感”,目前只有两类方案:
- XCTest +
setLocation::在 UI 自动化测试里直接喂坐标,完全不签名第三方 App,适合跑 LBS 业务回归。 - 企业证书 + MDM 分发:需要公司主体资质,个人开发者用不了。
对个人玩家来说,老老实实跟着本文 Q1–Q3 走才是成本最低的路线。
Sources
- GitHub Trending 2026-07-03
- GitHub Issues: mekos2772/ios-location-spoofer #12 #27 #41 #63
- Reddit r/jailbreak “iOS 17 location spoofing without jailbreak” megathread
- Reddit r/iOSProgramming “Best way to test location-based features”
- Apple Developer Documentation: Simulating Location
- Shadowrocket 官方 Module 加载规范