先把问题拆成两层:Shadowrocket 是否拿到了订阅文本,拿到的文本又是不是它当前入口能解析的节点格式。Apple iTunes lookup 在 2026-05-23 返回的 Shadowrocket 版本为 2.2.84,描述里也写明它不包含代理服务或服务器资源,用户要自己提供配置;所以「导入后为空」优先查订阅来源,不先假设 App 自带节点丢失。

本文记录的排查环境是 iOS / iPadOS 上的 Shadowrocket 远程订阅导入。未测试 TestFlight 版、企业签名包、越狱插件、第三方改包客户端;这些环境的菜单和刷新行为可能不同。

证据表:哪些结论能确定,哪些不能确定?

证据项2026-05-23 核对结果用在本文的判断
Shadowrocket 来源Apple lookup 返回 App 名称、开发者、价格、最低 iOS 版本和「不包含代理服务或服务器资源」说明节点来自你的订阅 URL,不来自 App 内置资源
iOS 配置描述文件Apple 支持文档说明配置文件位于「设置 > 通用 > VPN 与设备管理」VPN/Profile 问题和订阅文本解析要分开排查
Mihomo 配置Mihomo 文档展示 proxiesproxy-groupsproxy-providersrules 等 YAML 配置区域看到这些字段时先按 Clash/Mihomo YAML 判断格式
sing-box 配置sing-box 官方文档写明配置文件使用 JSONURL 返回 JSON 时,不要直接当 Shadowrocket 节点列表处理
不能确认Shadowrocket 未在公开页面逐项列出所有订阅解析边界本文只把格式差异写成排查方向,不写成官方兼容矩阵

先看哪种空节点表现?

同样叫「节点为空」,背后原因不一样。先对照表现,不要一上来删 App。

表现更可能原因第一检查点
导入成功,但节点数为 0URL 返回空文本、HTML、错误格式Safari 打开完整订阅 URL
刷新后还是旧时间App 没拉到远程内容网络请求、token、旧远程配置
Safari 显示 403 Forbiddentoken 过期、账号无权限、服务端拒绝请求重新生成订阅 URL
Safari 是登录页或套餐页复制了后台网页链接,不是订阅输出找「复制订阅」或专用导出入口
Clash/Mihomo 能导入,Shadowrocket 为空输出格式偏向 Clash/Mihomo YAML换 Shadowrocket/V2Ray/URI 输出
另一台 iPhone 能用,本机为空本机旧远程配置、系统日期、网络环境或 VPN/Profile 干扰删除远程配置后重导

一个快速判断:Safari 里能看到文本,不代表一定能导入;Safari 里只看到网页,基本可以先判定 URL 不是有效节点订阅。

订阅 URL 怎么复制才不会丢 token?

订阅 URL 要复制完整的一行,尤其是 ? 后面的参数。很多空节点来自聊天软件、短链接预览、二维码中转或网页按钮只复制了前半段。

重点检查这些位置:

  1. URL 里是否有 token=key=sub=uid= 这类参数。
  2. & 后面的 type=flag=target=client= 是否还在。
  3. 复制后有没有变成两行,或被输入法自动加了空格。
  4. 网页里显示的短预览不是完整 URL,要点复制按钮或长按实际链接。
  5. 从 HTML 页面复制时,确认 & 没被原样带进 App;它应该还原成 &

如果链接要塞进 URL Scheme 或二维码,整条订阅 URL 还可能需要 URL encoding。典型问题是 # 后面的片段被当成名称、+ 被某些中间环节当成空格、%2F 被重复解码成 /。遇到这种情况,先不用 URL Scheme,直接在 Shadowrocket 的订阅地址输入框手动粘贴原始 URL。

token、403 和 HTTP 200 HTML 怎么分辨?

403401、空文本、HTTP 200 但内容是 HTML,处理方式完全不同。iPhone 上不方便看响应头时,先用 Safari 判断页面形态;有 Mac 或 Windows 时,再保存前 20 行内容。

curl -L -I "订阅URL"
curl -L "订阅URL" | sed -n '1,20p'

PowerShell 可以这样保存:

$u = "订阅URL"
Invoke-WebRequest -Uri $u -MaximumRedirection 5 -OutFile sub.txt
Get-Content .\sub.txt -TotalCount 20
Select-String -Path .\sub.txt -Pattern "<!doctype|<html|403|proxies:|vmess://|ss://|trojan://"

判断规则很简单:

  • 403 Forbidden:优先看 token、账号权限、订阅是否被重置。
  • 401 Unauthorized:常见于需要登录态或 Basic Auth 的接口,不要拿后台 API 地址直接导入。
  • <!doctype html><html><title>Login</title>:这是网页,不是节点配置。
  • 空文件或只有一行错误提示:把错误提示发给订阅提供方,比在 App 里重复刷新更有效。
  • 有多行 ss://vmess://trojan://:更接近通用节点订阅,再回 Shadowrocket 看旧配置和解析。

HTTP 200 不是成功标准。很多后台会用 200 返回登录页、套餐页、公告页,客户端只会拿到一堆 HTML 标签,节点自然是 0。

base64、YAML、JSON 到底哪种格式错了?

Shadowrocket 的公开 App Store 描述没有给出完整格式兼容矩阵,所以排查时不要把「某个网友说能导」写成官方结论。更稳的办法是先看文件开头和关键词。

返回内容特征更像哪种格式空节点时怎么处理
多行 ss://vmess://trojan://通用分享链接列表回 App 删除远程配置后重导
一整段 base64,解码后是多行分享链接base64 包装的通用订阅确认服务端没有返回空 base64
proxies:proxy-groups:proxy-providers:Clash/Mihomo YAML找 Shadowrocket/URI/V2Ray 输出,或用 Clash/Mihomo 交叉验证
{ "log": ... }"outbounds""route"sing-box JSON不要直接当 Shadowrocket 订阅导入
<!doctype html>、CSS、JS网页回订阅后台复制真正输出链接

Mihomo 官方配置文档展示的是 YAML 体系,常见字段包括 proxiesproxy-groupsproxy-providersrules。sing-box 官方配置文档明确写的是 JSON,常见顶层字段是 logdnsinboundsoutboundsroute 等。看到 JSON 或 YAML,不代表 Shadowrocket 一定能解析出节点;它至少说明你要先确认导出入口是不是给 iOS 客户端用的。

如果你手里有 Clash Verge Rev、Mihomo Party 或其他 Mihomo 客户端,可以用同一条 URL 交叉验证。Mihomo 能看到节点、Shadowrocket 空,优先怀疑格式入口;Mihomo 也为空,优先怀疑 URL、token 或服务端返回。

iOS 网络权限和 VPN 描述文件要查哪些?

订阅导入为空通常不是系统 VPN 描述文件造成的,但 iOS 层面的设置会让排查变乱。按这个顺序看:

  1. 设置里确认 Shadowrocket 没被关掉蜂窝数据;Wi-Fi 下也试一次。
  2. 系统日期和时间改回自动,避免服务端 token 校验异常。
  3. 关闭其它 VPN 客户端后再刷新订阅,排除本机请求被另一层代理改写。
  4. 到「设置 > 通用 > VPN 与设备管理」查看是否有异常配置描述文件。
  5. 如果刚拒绝过 Shadowrocket 添加 VPN 配置的系统弹窗,先重新打开 App,等系统提示后允许添加。

Apple 支持文档说明,已安装的配置文件位于「VPN 与设备管理」,删除 profile 会同时删除它安装或管理的设置。这里要谨慎:不要为了一个空订阅把公司 MDM、学校配置或工作设备 profile 直接删掉;先确认这是你自己安装的网络配置。

删除旧远程配置和重新导入怎么做?

当 URL 确认能返回节点文本,格式也看起来正确,但 Shadowrocket 仍然空,再处理本机旧远程配置。顺序如下:

  1. 截图保存当前远程配置名称、分组和更新时间。
  2. 删除出问题的远程订阅或 Remote Config,不要只点刷新。
  3. 彻底退出 Shadowrocket,再重新打开。
  4. 手动粘贴完整 URL,别从剪贴板自动识别入口导入。
  5. 导入后先看更新时间,再看节点数量。
  6. 节点出现后,做一次延迟测试或连接测试。

如果你在多台设备之间复用订阅,最好保留一条确认能被 Clash/Mihomo 或 V2Ray 类客户端识别的交叉验证来源。多人维护设备、经常切换 iPhone、iPad、电脑和软路由时,可以用兼容 Clash / Singbox / V2Ray 的订阅做对照:同一账号下不同格式输出都为空,多半是 token 或账号侧问题;只有 Shadowrocket 空,才回到 iOS 客户端和格式入口继续查。

什么时候找订阅提供方,什么时候继续查客户端?

把下面四条信息整理好再找提供方,沟通会快很多:

  • 完整订阅 URL 不要发公开频道,可以只发域名、路径和隐藏后的 token 片段。
  • Safari 打开后的截图:是 403、登录页、空白还是节点文本。
  • Shadowrocket 版本、iOS 版本、设备型号。
  • 同一 URL 在 Clash/Mihomo 或 sing-box 里的结果。

该找提供方的情况:token 失效、账号权限异常、后台只给 Clash/Mihomo 格式、HTTP 200 返回登录页、同一 URL 多端都为空。

继续查客户端的情况:Safari 能看到通用分享链接,另一台 iPhone 能导入,本机删除远程配置后仍然空,或只在开启另一个 VPN/Profile 后失败。

怎么确认已经修好?

修好不只看「导入成功」四个字。至少满足这几项:

  • Safari 打开完整 URL 能看到节点文本或可识别配置文本。
  • Shadowrocket 远程配置更新时间变成当前时间。
  • 节点数量从 0 变成具体数字。
  • 关闭再打开 App 后节点不消失。
  • 手动刷新一次不会重新变空。
  • 同一 URL 的格式和订阅后台选择一致,不再混用 sing-box JSON、Mihomo YAML 和通用 URI。

如果导入后有节点,但连接失败,那已经不是「节点为空」问题,下一步才看规则分流、DNS、证书、系统代理和服务端连通性。

相关阅读

FAQ

Shadowrocket 导入订阅后为什么显示 0 个节点?

最常见原因是订阅 URL 没返回可解析节点:token 过期、参数被截断、返回登录页或格式不匹配。先用 Safari 打开完整 URL,看真实响应。

Safari 打开订阅链接是网页但状态码 200,算正常吗?

不算。HTTP 200 只说明服务器有响应;如果内容是 HTML 登录页、套餐页或错误页,Shadowrocket 仍然解析不出节点。

Clash/Mihomo 能导入,Shadowrocket 为空怎么办?

这通常指向格式差异。去订阅后台找 Shadowrocket、V2Ray、SS、Trojan 或通用 URI 输出,不要直接拿 Clash/Mihomo YAML 当唯一来源。

重新复制订阅 URL 时要注意什么?

复制完整 URL,不要只复制聊天软件预览。重点保留问号后的 token、type、flag、sub 参数;经过跳转或二维码时还要确认 URL 编码没有被改写。

删除 App 重装能解决空节点吗?

只有本机旧远程配置状态异常时才可能有用。URL 或 token 错误时,重装后仍然为空,还会丢掉本地规则、分组和已授权配置。

iOS VPN 描述文件会导致订阅导入为空吗?

描述文件更常影响连接和系统级 VPN 设置,不是订阅文本解析的首要原因。先查 URL 响应;再到 VPN 与设备管理里清理异常配置。