先把问题拆成两层: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 文档展示 proxies、proxy-groups、proxy-providers、rules 等 YAML 配置区域 | 看到这些字段时先按 Clash/Mihomo YAML 判断格式 |
| sing-box 配置 | sing-box 官方文档写明配置文件使用 JSON | URL 返回 JSON 时,不要直接当 Shadowrocket 节点列表处理 |
| 不能确认 | Shadowrocket 未在公开页面逐项列出所有订阅解析边界 | 本文只把格式差异写成排查方向,不写成官方兼容矩阵 |
先看哪种空节点表现?
同样叫「节点为空」,背后原因不一样。先对照表现,不要一上来删 App。
| 表现 | 更可能原因 | 第一检查点 |
|---|---|---|
| 导入成功,但节点数为 0 | URL 返回空文本、HTML、错误格式 | Safari 打开完整订阅 URL |
| 刷新后还是旧时间 | App 没拉到远程内容 | 网络请求、token、旧远程配置 |
Safari 显示 403 Forbidden | token 过期、账号无权限、服务端拒绝请求 | 重新生成订阅 URL |
| Safari 是登录页或套餐页 | 复制了后台网页链接,不是订阅输出 | 找「复制订阅」或专用导出入口 |
| Clash/Mihomo 能导入,Shadowrocket 为空 | 输出格式偏向 Clash/Mihomo YAML | 换 Shadowrocket/V2Ray/URI 输出 |
| 另一台 iPhone 能用,本机为空 | 本机旧远程配置、系统日期、网络环境或 VPN/Profile 干扰 | 删除远程配置后重导 |
一个快速判断:Safari 里能看到文本,不代表一定能导入;Safari 里只看到网页,基本可以先判定 URL 不是有效节点订阅。
订阅 URL 怎么复制才不会丢 token?
订阅 URL 要复制完整的一行,尤其是 ? 后面的参数。很多空节点来自聊天软件、短链接预览、二维码中转或网页按钮只复制了前半段。
重点检查这些位置:
- URL 里是否有
token=、key=、sub=、uid=这类参数。 &后面的type=、flag=、target=、client=是否还在。- 复制后有没有变成两行,或被输入法自动加了空格。
- 网页里显示的短预览不是完整 URL,要点复制按钮或长按实际链接。
- 从 HTML 页面复制时,确认
&没被原样带进 App;它应该还原成&。
如果链接要塞进 URL Scheme 或二维码,整条订阅 URL 还可能需要 URL encoding。典型问题是 # 后面的片段被当成名称、+ 被某些中间环节当成空格、%2F 被重复解码成 /。遇到这种情况,先不用 URL Scheme,直接在 Shadowrocket 的订阅地址输入框手动粘贴原始 URL。
token、403 和 HTTP 200 HTML 怎么分辨?
403、401、空文本、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 体系,常见字段包括 proxies、proxy-groups、proxy-providers 和 rules。sing-box 官方配置文档明确写的是 JSON,常见顶层字段是 log、dns、inbounds、outbounds、route 等。看到 JSON 或 YAML,不代表 Shadowrocket 一定能解析出节点;它至少说明你要先确认导出入口是不是给 iOS 客户端用的。
如果你手里有 Clash Verge Rev、Mihomo Party 或其他 Mihomo 客户端,可以用同一条 URL 交叉验证。Mihomo 能看到节点、Shadowrocket 空,优先怀疑格式入口;Mihomo 也为空,优先怀疑 URL、token 或服务端返回。
iOS 网络权限和 VPN 描述文件要查哪些?
订阅导入为空通常不是系统 VPN 描述文件造成的,但 iOS 层面的设置会让排查变乱。按这个顺序看:
- 设置里确认 Shadowrocket 没被关掉蜂窝数据;Wi-Fi 下也试一次。
- 系统日期和时间改回自动,避免服务端 token 校验异常。
- 关闭其它 VPN 客户端后再刷新订阅,排除本机请求被另一层代理改写。
- 到「设置 > 通用 > VPN 与设备管理」查看是否有异常配置描述文件。
- 如果刚拒绝过 Shadowrocket 添加 VPN 配置的系统弹窗,先重新打开 App,等系统提示后允许添加。
Apple 支持文档说明,已安装的配置文件位于「VPN 与设备管理」,删除 profile 会同时删除它安装或管理的设置。这里要谨慎:不要为了一个空订阅把公司 MDM、学校配置或工作设备 profile 直接删掉;先确认这是你自己安装的网络配置。
删除旧远程配置和重新导入怎么做?
当 URL 确认能返回节点文本,格式也看起来正确,但 Shadowrocket 仍然空,再处理本机旧远程配置。顺序如下:
- 截图保存当前远程配置名称、分组和更新时间。
- 删除出问题的远程订阅或 Remote Config,不要只点刷新。
- 彻底退出 Shadowrocket,再重新打开。
- 手动粘贴完整 URL,别从剪贴板自动识别入口导入。
- 导入后先看更新时间,再看节点数量。
- 节点出现后,做一次延迟测试或连接测试。
如果你在多台设备之间复用订阅,最好保留一条确认能被 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、证书、系统代理和服务端连通性。
相关阅读
- Shadowrocket 订阅更新后节点列表空白怎么排查
- Shadowrocket 订阅更新超时怎么排查
- Mihomo profile 里 proxies 为空怎么办
- Clash Verge Rev 导入订阅后显示 HTML 怎么办
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 与设备管理里清理异常配置。