关于 quest-webxr
面向 Horizon OS 的 WebXR 体验与 PWA 构建指导,帮助 Web 开发者评估网页路线、在头显 Browser 中测试,并处理打包、分发和性能约束。
主要功能
- 01WebXR 与 PWA 交付指导
- 02Web 3D 框架选择
- 03头显 Browser 测试流程
- 04通过 Android 工具远程调试
- 05使用 Bubblewrap 打包 PWA
- 06性能与分发检查
适用场景
- 01制作沉浸式 Web 演示
- 02在头显中验证网站
- 03将 WebXR 网站打包为 PWA
- 04评估 Web 性能与交付方式
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ssheleg/ xr-dev --skill quest-webxr安装后在 Claude Code 中输入/quest-webxr确认已加载。
附带文件references/pwa-packaging.mdreferences/runtime-delivery.md
详细介绍
Horizon OS 上的 WebXR 和 PWA
Web 路径以原生性能换取只需执行 git push 即可部署。它适合演示、目录、工具,以及任何还必须在头显之外运行的内容;如果帧预算已经吃紧,则不适合。
请阅读 references/runtime-delivery.md,了解会话/能力协商、普通屏幕回退、资源、托管以及浏览器/PWA 交付检查。
如果要制定完整的产品路线图或进行阶段审计,请使用 quest-lifecycle;单项技术任务仍由此负责人处理。如果该工具不存在,请直接说明当前阶段、相关证据和下一项前置要求。
避免返工的顺序
- 先构建网站,并在头显的浏览器中测试。 打包后的 PWA 使用相同的渲染引擎,因此所有兼容性和性能问题都能在打包前发现。
- 远程调试——通过 Android 平台工具,从计算机使用 Chrome DevTools 连接设备。浏览器规格页面包含用户代理字符串和支持的内容尺寸。
- 页面运行正常后再打包。
像真正的应用一样进入沉浸模式
从头显的应用库启动的 PWA 不应显示 2D 着陆页。页面加载后应立即请求会话:
const supported = await navigator.xr?.isSessionSupported('immersive-vr');
if (supported) {
const session = await navigator.xr.requestSession('immersive-vr');
await renderer.xr.setSession(session); // three.js
}
A-Frame 也会在 renderstart 时通过 scene.enterVR() 执行相同操作。Meta 自己的代码片段会通过 window.getDigitalGoodsService !== undefined 进行判断——已打包的 PWA 中存在此属性,普通浏览器中则不存在——因此用户在笔记本电脑上打开 URL 时,页面仍可正常运行。
选择框架
| 选择 | 适用场景 |
|---|---|
IWSDK(npm create @iwsdk@latest) | Meta 为屏幕 3D 和沉浸式 WebXR 推荐的路径;提供测试方案(桌面端的 IWER)以及构建/部署指南 |
| three.js | 已有 three.js 代码库,需要完全控制渲染器 |
| A-Frame | 声明式场景,最快实现原型 |
Meta 还为 IWSDK 路径提供了 hz-iwsdk-webxr 技能——IWSDK 专项工作请使用它;此技能负责判断 Web 路径是否合适,并处理打包和分发的衔接。
打包为 PWA
分步说明(包括决定沉浸式 PWA 能否启动的 Digital Asset Links 步骤):references/pwa-packaging.md。
npm install --global @meta-quest/bubblewrap-cli # verified at 1.24.1, Node 18+
bubblewrap --version
Bubblewrap 所需的前置条件如下,顺序也请遵循:
- 网站通过HTTPS提供服务,并具有有效的 Web App Manifest;
- 在 Developer Dashboard 中创建应用——如果 PWA 使用应用内购买,则需要 Meta Horizon Application ID;
- 签名密钥,或在
init期间创建密钥所需的信息; - 用于侧载测试且已开启开发者模式的头显。
首次运行时,Bubblewrap 会提示下载匹配的 JDK 和 Android 命令行工具;除非环境已自行管理这些工具,否则请允许下载。初始化 Quest 项目时,它会询问是否包含 Horizon Billing——如果计划使用 IAP,请准备好 Application ID 后再确认,因为之后添加就意味着重新生成项目。
变现和平台功能
WebXR PWA 中的应用内购买通过 Horizon Billing 和 Digital Goods API 实现;成就、排行榜和附加内容的服务器到服务器 API 可在 Web 文档索引中找到。请在打包之前设置好 IAP。
分发
打包后的 PWA 是 Android 软件包,其发布流程与原生构建相同:发布渠道、审核、VRC——请参阅 quest-store;PWA 专属的商店步骤请参考 Meta 的 hz-store-pwa 技能。2D(非沉浸式)PWA 按照一部分 VRC 进行审核,另有一份会触发自动拒绝的权限列表。
性能,实话实说
- 浏览器有自己的计数器——Web 文档中的绘制调用指标——而
quest-perf中的原生性能分析器无法查看页面内部。 - 帧预算与原生应用相同(72 Hz 下为 13.9 ms);开销却不同。请务必在头显中测量,切勿在桌面浏览器窗口中测量。
XRSession上的requestAnimationFrame是帧时钟;如果页面同时运行 DOM 动画,就要付出双倍开销。
阅读位置
index: https://developers.meta.com/horizon/llmstxt/documentation/web/llms.txt/
page: https://developers.meta.com/horizon/llmstxt/documentation/web/<slug>.md
有用的 slug:pwa-webxr、pwa-packaging、pwa-overview-gs、browser-specs、
browser-remote-debugging、3d-web、ps-iap、ts-webxr-perf-drawcall。
IWSDK 自己的指南位于 documentation/iwsdk/guides/ 下。
注意事项
- PWA 内的 2D 落地页会让人觉得应用坏了——请在加载时请求会话。
bubblewrap是 Meta 的分支(@meta-quest/bubblewrap-cli),并非 Google 的软件包;仅此分支包含 Quest 专用提示。- 计费是打包时的决定,不是运行时的决定。
- 在桌面浏览器中测试能验证逻辑,却会误导性能判断。
内容摘自 Meta Web 文档(pwa-webxr、pwa-packaging、3d-web),日期为 2026-09-20;文档中的版本会变动——引用前请重新核对 bubblewrap 和 IWSDK 的版本。
触发词
更多会将请求路由至此处的短语:“Quest 的 PWA” / “Quest 的 PWA”、“A-Frame”、“bubblewrap”、 “头显的 Web 应用清单”、“Quest 上的浏览器” / “头显中的浏览器”、“远程调试头显浏览器” / “调试头显浏览器”、“Web IAP” / “网页购买”。
从 0.4.4 的描述中移至此处:“沉浸式 VR 会话”、“沉浸式会话”、“Quest 上的 three.js”。