docs: 新增 Windows 移植交接文档

docs/WINDOWS_PORT.md 覆盖:
- 逐文件可移植性审计(核心逻辑层约 90% 可直接复用)
- 核心难点:iOS 17+ 的 RSD 隧道无法在 Windows 复用(macOS 实现依赖 XPC +
  ObjC runtime 私有框架),改用 pymobiledevice3 的 userspace 隧道
- 已实测确认的命令与 API(--userspace 挂在 lockdown start-tunnel / mounter
  auto-mount 上,remote start-tunnel 不支持;类名是 UserspaceRsdTunnel)
- 窗口启动、数据目录、打包与分发(DMG → Inno Setup)、图标(.icns → .ico)
- macOS 侧踩过的坑:镜像挂载用 Python API、必须打包包元数据、不要把 distutils
  放进 excludes、AlreadyMountedError 当成功处理
- 设计约束(DVT 长连接、只能改经纬度、last_point 与 last_reported 分离等)
- 验收基线(复用现有测试套件)与建议的工作顺序
This commit is contained in:
jbjf6666 committed 2026-10-16 01:05:09 +08:00
commit 85e9a53750
65 files changed
+18603

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
# 一步完成:生成图标 → 打包独立 .app → ad-hoc 签名 → 制作 DMG → 验证
# 产物:dist/虚拟定位轨迹.app(独立运行)、dist/虚拟定位轨迹-<版本>.dmg(分发用)
set -euo pipefail
cd "$(dirname "$0")/.."
PY=".venv/bin/python"
VERSION="1.0.0"
APP="dist/虚拟定位轨迹.app"
DMG="dist/虚拟定位轨迹-${VERSION}.dmg"
if [ ! -x "$PY" ]; then
echo "未找到 $PY,请先运行 ./scripts/run.sh 完成依赖安装"
exit 1
fi
# 1) 依赖:PyInstaller(打包用)
if ! "$PY" -c "import PyInstaller" >/dev/null 2>&1; then
echo "安装 PyInstaller…"
"$PY" -m pip install --quiet --disable-pip-version-check \
-i "${IOSLOC_PIP_INDEX:-https://mirrors.aliyun.com/pypi/simple/}" pyinstaller
fi
# 2) 图标
if [ ! -f resources/AppIcon.icns ]; then
echo "生成图标…"
"$PY" tools/make_icon.py
fi
# 3) 开发者镜像素材(iOS 17+ 全系共用;体积大,不入 git,首次构建时下载)
if [ ! -f resources/ddi/personalized/Image.dmg ]; then
echo "下载 iOS 17+ 个性化镜像素材(约 16MB,仅需一次)…"
"$PY" tools/fetch_ddi.py || {
echo "素材下载失败。可手动放到 resources/ddi/personalized/ 后重试:"
echo " Image.dmg / BuildManifest.plist / Image.dmg.trustcache"
exit 1
}
fi
# 4) 打包
echo "打包 .app(约 2-4 分钟)…"
"$PY" -m PyInstaller --clean --noconfirm --log-level WARN Location.spec
# 5) ad-hoc 签名:Apple Silicon 上未签名的 arm64 应用可能被系统直接拒绝运行
echo "ad-hoc 签名…"
codesign --force --deep --sign - "$APP"
codesign --verify --deep --strict "$APP" && echo " 签名校验通过"
# 6) 制作 DMG
echo
"$PY" tools/make_dmg.py
# 7) 验证独立运行
echo
"$PY" tools/verify_bundle.py
echo
echo "================================================"
echo "完成:"
echo " 独立应用:$APP"
echo " 分发镜像:$DMG"
echo "================================================"
+81
View File
@@ -0,0 +1,81 @@
#!/usr/bin/env bash
# iOS 虚拟定位轨迹工具 — 一键启动脚本
set -euo pipefail
cd "$(dirname "$0")/.."
ROOT="$(pwd)"
VENV="$ROOT/.venv"
PY="$VENV/bin/python"
# 国内网络:默认走阿里云镜像(可用 IOSLOC_PIP_INDEX 覆盖)
PIP_INDEX="${IOSLOC_PIP_INDEX:-https://mirrors.aliyun.com/pypi/simple/}"
bold() { printf '\033[1m%s\033[0m\n' "$1"; }
info() { printf ' %s\n' "$1"; }
warn() { printf '\033[33m %s\033[0m\n' "$1"; }
fail() { printf '\033[31m %s\033[0m\n' "$1"; }
bold "iOS 虚拟定位轨迹工具"
info "目录:$ROOT"
# ---------- 1. Python ----------
if [ ! -x "$PY" ]; then
PYTHON_BIN=""
for candidate in python3.12 python3.13 python3.11 python3; do
if command -v "$candidate" >/dev/null 2>&1; then
PYTHON_BIN="$(command -v "$candidate")"
break
fi
done
if [ -z "$PYTHON_BIN" ]; then
fail "未找到 python3,请先安装 Python 3.11+(推荐:brew install python@3.12)"
exit 1
fi
info "创建虚拟环境($PYTHON_BIN)…"
"$PYTHON_BIN" -m venv "$VENV"
fi
info "Python:$("$PY" -V 2>&1)"
# ---------- 2. 依赖 ----------
need_install=0
if ! "$PY" -c "import pymobiledevice3" >/dev/null 2>&1; then
need_install=1
fi
if [ "$need_install" = "1" ]; then
bold "首次运行:安装依赖(约 1-3 分钟,走国内镜像)"
if ! "$PY" -m pip install --quiet --disable-pip-version-check -i "$PIP_INDEX" pymobiledevice3; then
warn "国内镜像失败,改用官方源重试…"
if ! "$PY" -m pip install --quiet --disable-pip-version-check pymobiledevice3; then
fail "依赖安装失败。请手动执行:"
fail " $PY -m pip install -i $PIP_INDEX pymobiledevice3"
exit 1
fi
fi
info "依赖安装完成"
fi
info "pymobiledevice3:$("$PY" -c "import pymobiledevice3,sys;print('已就绪')" 2>/dev/null || echo '不可用')"
# ---------- 3. 设备提示 ----------
if [ "${1:-}" != "--mock" ] && [ "${IOSLOC_MOCK:-0}" != "1" ]; then
DEV_COUNT="$("$PY" - <<'EOF' 2>/dev/null || echo 0
import asyncio
try:
from pymobiledevice3.usbmux import list_devices
print(len(asyncio.run(list_devices())))
except Exception:
print(0)
EOF
)"
if [ "$DEV_COUNT" = "0" ]; then
warn "未检测到 iOS 设备:请用数据线连接、解锁设备,并在手机上点「信任」"
else
info "检测到 $DEV_COUNT 台 iOS 设备"
fi
if [ "$(id -u)" != "0" ]; then
info "提示:iOS 17 及以上需要 RSD 隧道,程序会优先使用免 root 的 native 隧道;"
info " 若失败,可改用管理员模式:sudo ./scripts/run.sh"
fi
fi
# ---------- 4. 启动 ----------
exec "$PY" "$ROOT/main.py" "$@"
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# 在终端里用真实设备跑一次「单点虚拟定位」,用于快速验证设备链路是否打通。
#
# 用法:
# ./scripts/test-location.sh # 默认定位到北京天安门
# ./scripts/test-location.sh 39.9088 116.3975 # 指定纬度 经度
# ./scripts/test-location.sh --clear # 让设备恢复真实定位
set -euo pipefail
cd "$(dirname "$0")/.."
PY=".venv/bin/python"
if [ "${1:-}" = "--clear" ]; then
exec "$PY" tools/probe_location.py --clear
fi
LAT="${1:-39.9088}"
LNG="${2:-116.3975}"
exec "$PY" tools/probe_location.py --lat "$LAT" --lon "$LNG"