Skip to content

Releases: ios151/Scripting

WLOC 虚拟定位 2.7.5

Choose a tag to compare

@ios151 ios151 released this 17 Oct 07:24

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。


坐标卡片同时给出两套坐标

GCJ-02   32.044077, 118.784902     [复制]
WGS-84   32.046127, 118.779695     [复制]

你在地图上点出来的是地图系(大陆是 GCJ-02),而真正下发给设备、别的 GPS 工具认的是 WGS-84 —— 国内两者差几百米。以前只显示前者,拿去和别的定位工具对账,会以为脚本算错了。那个差值恰恰是换算对了的证明。

  • 境外只显示一行。 GCJ-02 的偏移只在国内存在,境外两套值本来就一样 —— 并排列两行一模一样的数字再各标一个坐标系名,是在无中生有地制造区别。
  • 显示的 WGS-84 不带扰动。 扰动每次下发都是新的随机值,显示出来既对不上地图也复制不走。这里回答的是「这个点的真实坐标是多少」。
  • 复制格式是「纬度, 经度」,和 Apple 地图、Google、各类坐标拾取器一致,粘到别处不会反。旧的那行写的是「经度 … 纬度 …」,顺序正好相反。

「点坐标行开系统选点器」挪到了旁边的「精确选点」按钮上 —— 行里现在有复制按钮了,两个点击目标叠在一起会打架。还没选点时维持原样,整行可点。


换了脚本图标

脚本列表里不再是那个绿色定位箭头。


连接、定位、保活的行为都没有变动,接着 2.7.4。

WLOC 虚拟定位 2.7.4

Choose a tag to compare

@ios151 ios151 released this 16 Oct 21:04

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。

接着 2.7.3,把保活那条链路上剩下的两处补齐。定位和连接的行为没有变动。


配对失败时,终于说得出真因

配对要切到「设置」里输 PIN,这段时间本页在后台等,最多三分钟。如果后台保活没起来,这一页会被系统回收 —— 而你看到的只是一句「广播超时」,照着它查永远查不到点子上。

现在保活没拿到会直接写在 PIN 卡片里(橙色一行),告诉你多半是音频被别的 App 占着(在放歌或通话),停掉再试。提示放在 PIN 下面而不是状态栏 —— 状态栏那行会被配对进度一路覆盖,而这句话要在你切去「设置」的整段时间里都看得见。


一个耗电的洞

2.7.3 新加的保活记账里,申请保活如果直接报错,会留下一个永远松不掉的持有者 —— 后果是模拟结束之后音频引擎还在跑,一直耗到脚本退出。

触发条件比较苛刻(配对时报错、同时模拟那边又是成功的),但确实在 2.7.3 里。

WLOC 虚拟定位 2.7.3

Choose a tag to compare

@ios151 ios151 released this 16 Oct 20:39

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。

用 2.7.1 / 2.7.2 的请务必更新。 那两版在蜂窝下几分钟就会掉一次线,是我改坏的。


蜂窝下几分钟一断,修好了

2.7.1 我给后台保活加了一道「只有从脚本列表打开才允许」的拦截,依据是文档里那句「仅 Script.env === "index" 时可用」。但首页标签页跑在主 App 里,保活本来一直是好的 —— 这一拦把那个入口整个废掉了:切去任意一个 App 几分钟,Scripting 就被系统挂起,隧道断、定位弹回真实位置,而界面上什么都不报。

「随便打开个天气就断」「几分钟必断,蜂窝压根没法用」说的都是这个。抱歉。

能不能保活,现在问系统自己,不再按入口名字预判。


顺带两处,锁屏和配对

锁屏那一下更稳了。 以前是「切后台才申请保活、回前台就撤掉」—— 按下电源键的一瞬间,音频引擎根本来不及起来,App 几秒内就被挂起。现在开始模拟时(还在前台)就申请好,一直持有到你停止模拟为止。

模拟进行中去重新配对,不会再把模拟的保活一起撤掉。 系统更新后边模拟边重新配对是常见操作,而配对结束时那句「释放保活」释放的是整个脚本的那一份。


感谢 @githubdulong 定位到那一行并提交了 PR #1。

WLOC 虚拟定位 2.7.2

Choose a tag to compare

@ios151 ios151 released this 16 Oct 12:30

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。

接着 2.7.1,把那份审查清单里剩下的问题做完。


报错终于说人话了

连不上时不再一律弹那个讲蜂窝的引导。 以前只要建会话失败就弹它,于是「系统更新后配对授权失效」「权限被拒」「隧道握手失败」统统显示成「连不上这台设备」,还附一段让你去开关飞行模式的说明 —— 方向完全是错的。现在只有真正「找不到配对服务」才弹,其余直接说真因。

重连失败时报的是最后一次的错,不再是最初那次掉线的原因。掉线常常只是网络切换的一瞬,而重连连不上才是真正拦路的那件事(比如切到蜂窝后配对服务不在了)—— 只报最初那句,照着查永远查不到点子上。


地图链接:百度的坐标一直是偏的

界面提示写着支持百度链接,但从来没有做过 BD-09 换算 —— 解析出来的坐标直接当成了地图坐标,在北京一带差约 500 米。现在补上了。

另外带 coord_type=wgs84 这类参数的链接也会正确换算。Google 和纯文本维持原样 —— 大陆版和国际版用的坐标系不同,而链接里看不出是哪个,猜错了反而更糟。

解析出来的坐标现在会做值域检查,不会再把一个离谱的数字写进设备。


其他修正

  • 搜到的地名会被街道名覆盖 —— 搜索「杭州大剧院」跳过去之后,名字转眼变成一个街道名,历史还会多出一条重复记录。
  • 移动的实际速度偏慢 —— 推进按固定节拍算,而系统忙或锁屏时这个节拍会被延迟甚至合并,走过的距离比设定的少。现在按真实流逝的时间算。
  • 重连期间可以取消了 —— 五轮重连加等待可能跑一分多钟,以前只能干等,按钮是灰的。现在底部有「取消」,状态也显示「第 2/5 次」。
  • 「上次的模拟没有正常结束 · 最后模拟到 X」里的 X 一直是起点 —— 移动了一路之后崩掉,提示给的还是出发地。
  • 配对时会掐掉正在显示的模拟卡片 —— 系统更新后重新配对时尤其明显:模拟还在跑,卡片却没了。
  • 边打边搜会被短前缀的结果覆盖 —— 打「上海虹桥」发四次请求,返回顺序不保证。现在停下 300 毫秒才搜,并且只认最后一次。
  • 对端地址多一个空格就连不上 —— 而报错是「无响应」,看不出是地址本身错了。现在统一清洗。

WLOC 虚拟定位 2.7.1

Choose a tag to compare

@ios151 ios151 released this 16 Oct 12:04

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。

这一版主要是稳定性。做了一次覆盖协议层和会话逻辑的完整审查,修掉了十几个问题,其中几个会直接让会话断掉。建议升级。


会用到新系统接口的三处

Scripting 这次更新补了几个一直缺的东西,正好对上三个老问题:

  • 蜂窝引导不再问「你在用 WiFi 还是流量」 —— 现在自己看得出来,文案直接说结论。而且重试改成由网络变化驱动:关掉飞行模式的那一刻就立刻试,不再 1.5 秒一次地盲等(那个窗口很短,盲等常常整段错过)。
  • 「连接状态」里多了 Scripting 版本 —— 排查别人的问题时,之前连对方跑的是哪版宿主都不知道。
  • 建隧道的超时交给系统 —— 原先只是「不再等待」,底下那次其实还挂着;现在会真的停掉,失败后还会清理残留。

这些情况下会话不会再断了

  • 设备回一个错误包,整条连接被关掉。 之后每一拍心跳都必然失败,「宽限 4 拍」形同虚设,会话必被拆。现在只有真的读不到数据才关 —— 设备回了错误只说明这一次调用被拒,链路好好的。
  • 输错一次坐标就毁掉整条会话。 坐标是先记下来再下发的,越界被拒之后那个坏值留在了心跳里,拍拍失败,4 拍后会话没了。现在下发成功才记。
  • 掉线后重连时,后台保活被提前撤掉。 掉线十有八九发生在锁屏时,保活一撤,重连循环立刻跟着被挂起。现在等真正放弃时才撤。
  • 心跳堆积。 设备不回包时每个任务要等满 15 秒,而 4 秒一拍还在不停往队列里加 —— 判定掉线可能要攒一分钟。现在上一拍没落地就跳过这一拍。

几个能看见的修正

  • 移动时锁屏卡片一直显示成定点 —— 方式、速度、进度条全都没有。现在正常显示了,移动结束也会切回定点的样子。
  • 掉线重连会跳回最初那个点 —— 点过「更新坐标」之后再掉线尤其明显。现在回到最后一次实际生效的位置。另外移动结束后的会话以前永远不再重连,现在也会了。
  • 锁屏卡片的「恢复真实位置」在没有会话时直接报失败 —— 而「上次没正常收尾」「停止失败后」这些最需要它的场景,恰恰都没有会话。现在主脚本会自己连上去补发。
  • 停止失败后那十几秒界面是空闲的 —— 这时点「开始」会并发建第二条隧道。现在有明确的「正在重连补发停止…」状态。
  • 首页标签页 / 分享入口不支持后台保活 —— 以前会提示「系统拒绝了后台保活」,让人去关音乐、查通话,其实怎么弄都没用:那两个环境根本不支持。现在直说。

其他

  • 配对校验补了超时 —— 设备不回话时,界面以前会永远停在「验证新配对记录…」。
  • 导入配对文件时,64 字节格式的私钥会被取错(拿到的是公钥),签名必失败却报成「设备拒绝了配对」。
  • 开启了「按脚本单独授权」并拒掉本机隧道权限时,错误以前会伪装成「卡在隧道握手这一步」。

WLOC 虚拟定位 2.6.2

Choose a tag to compare

@ios151 ios151 released this 16 Oct 09:04

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。

2.6.1 没修干净。 用「代理工具提供」模式、且遇到过「点开始模拟立刻失败」的,请升到这一版。


接着上一版的问题

2.6.1 把读自身隧道状态的那一处做了容错,但真机日志显示启动还是失败——断点只是挪到了下一处:

代理模式读自身隧道状态失败,跳过      ← 2.6.1 的修复生效了
代理模式下 10.7.x.x:49152 可达        ← 这一步顺利走完
读自身隧道状态撞上并发变更,重读一次  ← 紧接着又读了一次
启动失败                             ← 挂在这里

挂掉的那一处,代码注释自己写着「只作记录」—— 它的全部产物就是一行日志,却把整个启动断掉了。

这次不再逐处打补丁,而是按用途分成两类:必须拿到状态的(只有「Scripting 自身」模式下确认隧道生效那一处)继续会失败;读到了锦上添花、读不到也能继续的一律不中断。据此修掉三处:

  • 「自身生效地址」那次读取 —— 本次的断点
  • 建隧道前的状态检查 —— 代理模式下它只记一笔,不该当拦截条件
  • 隧道生效的轮询 —— 这一轮没读到就等下一轮。轮询本来就有 20 次机会,而「VPN 正在变化」恰恰是轮询期间最可能发生的事,我们等的就是它变完

顺带一提

那位用户的日志里,TLS 取证回了 serverHello、Bonjour 公告的是 WiFi 地址而不是回环 —— 说明设备侧一切正常,唯一的障碍就是这个状态读取失败。

WLOC 虚拟定位 2.6.1

Choose a tag to compare

@ios151 ios151 released this 16 Oct 08:58

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。


用代理工具提供隧道时可能完全连不上

这一版修的就是这个,用「代理工具提供」模式的建议升级。

症状是点「开始位置模拟」立刻失败(几十毫秒,快到像没反应),而「连接状态」里配对端口、设备握手、接受隧道连接全是绿的,只有「本机隧道」一个红叉,写着一串 LocalDevVPN settings or the active configuration changed. Read again before saving.

原因:读 Scripting 自身隧道状态的那一步没有容错。这个状态用乐观并发控制,读的瞬间配置被别处改动就会失败——而代理工具连接、断开、切节点都会改动系统的活动 VPN 配置,撞上的概率不低。那句报错字面上说的是「这次没读到,再读一次」,不是「隧道坏了」。

更要紧的是:代理模式下那条隧道本来就不归脚本管,它的状态只用来提示一句话,却因为读不到把整条路堵死了。

现在:读失败会重试一次;再读不到就跳过那几个可选步骤继续往下走,让真正的问题自己浮出来。

诊断页不再误导

同一个根因在「连接状态」里的三处表现:

  • 代理模式下这一项不再标红 —— 读成功时本来就按模式判断(代理模式不判对错),读失败却一律算失败。
  • 那串英文翻成了人话:「读取时状态正在变化,没读到(代理工具或系统正在切换 VPN 时常见,不影响连接)」。
  • 底部提示改看握手结果。以前只要有红叉就说「从上往下第一个红叉就是断点所在」,哪怕下面握手已经成功——会把人带去查一条根本没在用的隧道。现在握手通了就直说「链路是通的」。

排查提示

日志只在内存里,脚本一关就没了。所以遇到问题时:先去「连接状态」清空日志 → 回去复现一次 → 不要关脚本 → 直接导出。失败后关掉重开,正好把证据清掉。

更快的办法:失败弹出引导时点「取消」,真实错误原因会直接显示出来。

WLOC 虚拟定位 2.6.0

Choose a tag to compare

@ios151 ios151 released this 16 Oct 07:49

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。


境外也能查出地名了

以前定位到首尔、东京这类境外地点,卡片上只有一串坐标。

原因是架构不对称:搜索早就有「国内 MapKit / 境外 Nominatim」两条路,反查却只有系统一条。而大陆设备的系统地理编码数据源是高德,境外没有 POI 覆盖,直接返回「无结果」。

现在系统查不到时会绕一趟自建服务,返回的是中文地名(Samcheong-ro, 三淸洞, 鍾路區, 首尔特别市)。只在系统失败后才走——境内系统的结果更准也更快,没必要为了统一全绕出去。

同时修了卡片的两个问题:

  • 地名回来了,卡片不刷新。 地名是异步查的,而卡片在「开始模拟」那一刻就建好了。定点模拟下坐标不再变化,卡片就一直停在地名回来之前的样子。
  • 刷了也是旧值。 更隐蔽的一个:刚写入地名就去构造卡片,读到的还是上一个值,表现为「刷新了但没生效」。

可以放到首页了

Scripting 的首页 Tab 现在能选中本脚本。设置 → 打开 Show Home Tab(默认关闭),然后在列表里选「WLOC 虚拟定位」。

首页的实例是常驻的:切到别的 Tab 再回来,状态还在,脚本不停。而定位模拟本来就靠一条活连接和 4 秒心跳维持——以前从脚本列表进来、一退出就断,现在它能一直待着。


可以从地图直接分享过来了

在地图 App 里长按一个地点 → 共享 → 选「WLOC 虚拟定位」,会打开界面并把那个点落到地图上。苹果 / Google / 高德 / 百度的链接和裸坐标文本都认。

不会直接开始模拟:那要连设备、改系统定位,分享来的点也未必是想立刻生效的那个。摆上去让你确认一眼再按开始,和手动选点一致。


其他

  • 蜂窝引导的按钮大小拉平了。「我正在使用移动数据」原先是个窄胶囊、「取消」只有两个字那么大,而这个浮层弹出来的时候,用的多半就是蜂窝——最常走的那条路反倒最难按。
  • 图标换成系统符号(绿色定位箭头)。原先那张远程 PNG 不扁平,也不跟随深色模式。

WLOC 虚拟定位 2.5.1

Choose a tag to compare

@ios151 ios151 released this 16 Oct 07:09

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。

这一版累积了 2.3.2 之后的全部改动(2.3.3 – 2.5.1)。中间几个版本只在仓库里存在过,直接装这个就行。


蜂窝数据下连不上,根因查清了

以前只知道「开关一次飞行模式能好」,不知道为什么。现在知道了:

蜂窝下 remotepairingd 只绑在回环地址上,没绑任何网络接口。 WiFi 下它绑 ANY,所以隧道对端连得通;蜂窝下缩回回环,而设备又不接受从回环直连配对服务——两头堵死。开关飞行模式起作用,是因为接口重建会让它重新绑定。

判据是两个错误码的区别:10.7.0.1 是 connect 阶段 ECONNREFUSED(没人在听),而 127.0.0.1 是 read 阶段 ECONNRESET(连上了、对面读完才砍,服务确实在那儿)。

由此修掉的

  • Bonjour 公告的地址以前被整个丢掉,只取了端口,连接一律打到隧道对端。WiFi 下两者碰巧是一回事,蜂窝下不是。现在「隧道对端 + 公告地址」逐个试。
  • 公告里只有回环地址时直接给结论,不再列一串「开发者模式开了吗」「配对记录还在吗」的猜测——那些都不是原因。
  • 失败从 20 秒缩到 1 秒。回环地址不再做全段端口扫描:服务就在公告的那个端口上,扫出别的同样连不通,每个还要赔 6 秒握手超时。
  • 「握手超时」不再被误报成「本机隧道可能没真正建立」。那两件事的下一步完全相反。

仍然需要开关飞行模式

试过让脚本自己重建隧道(VPN.stop() → start())来代替,实测无效:重建完公告里依然只有回环地址。remotepairingd 要的是蜂窝/WiFi 接口本身重建,utun 顶替不了。代理工具也不行——Surge 的 reflect 是交换源/目的地址,落点是 TUN 自己的地址而非 127.0.0.1,同样连不上。

脚本侧能做的已经到头了,现在至少能准确告诉你卡在哪、该做什么。


提示弹窗改成半屏浮层

系统 alert 的正文不滚动:行数一多就压字号,再多直接截断。而这个脚本最需要说清楚的恰恰是最长的那几段——连不上时那段带四步操作指引的说明,配对页那条「设置 → 隐私与安全性 → 开发者 → 配对」的路径,都是十几行。

  • 正文可滚动,高度跟着内容走:有详情时半屏起步、可往上拉到整屏;一行短提示就只占一小条。
  • 确认框的主按钮改放上面。系统弹窗是反的,而手指自然落点在下面那颗——最该谨慎的操作反倒最好按。
  • 蜂窝引导里三档按钮现在一律整行。「我正在使用移动数据」原先是个窄胶囊、「取消」只有两个字那么大,可点面积比「重试」小一大截;而这个浮层弹出来的时候,用的多半就是蜂窝。
  • 收藏页空状态换成系统标准组件,字号和配色会跟着系统设置走。

其他

  • 图标换成系统符号(绿色定位箭头),不再是那张远程 PNG——它不扁平,也不跟随深色模式。
  • 启动时「上次的模拟没有正常结束」修了个缺陷:以前下拉关掉也会清除恢复记录,下次就不再提醒,可设备那头可能还保持着假位置。现在只有明确点「暂不处理」才清。
  • 「一键跳转到开发者模式设置页」确认做不到。苹果官方的 Supported URL Schemes 清单里没有「隐私与安全性」,网上那些 prefs:root= 的写法在 iOS 18 之后也全部失效(只能跳到设置根页)。这条路已经堵死,页面里继续写文字指引。

WLOC 虚拟定位 2.3.2

Choose a tag to compare

@ios151 ios151 released this 16 Oct 03:09

⬇️ 安装

点此一键安装 —— 必须在 iPhone / iPad 上用 Safari 打开。

修了一个该尽快升的问题

2.3.0 / 2.3.1 会把「远程资源」里的链接清空,导致以后不再自动检查更新。

原因是 2.3.0 加 GPL 时,顺手往 script.json 塞了一个 license 字段——而那不是 Scripting 定义的字段(Script.metadata 只有 name、version、author、contributors、remoteResource、icon、color 这些)。多出来的字段让元数据解析不按预期走,remoteResource.url 就读不到了。

许可信息本来就该由 LICENSE 和 NOTICE.md 承担,不该挤进 script.json。

从 2.3.0 或 2.3.1 升上来的话,装完去「远程资源」看一眼链接回来没有。还是空的就手动填:
https://raw.githubusercontent.com/ios151/Scripting/main/dist/WLOC.zip

其余内容同 2.3.1。