移动/游戏
为 Expo/React Native 应用添加 Meta…
在现有 Expo 或 React Native 项目中添加 Meta Quest / Horizon OS 支持、迁移 location/notifications,并构建、运行或发布到 Quest 时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
为 Expo/React Native 特定
解决思路
- 总则:本技能不捆绑文档副本;任何任务都要 webfetch 链接的官方 README 或 Meta 文档页面,以获取最新安装步骤、插件选项、API 和功能矩阵;只采用本技能中的决策树、关键规则和容易漏掉的坑。
- 决策树·从零开始或给现有 Expo 应用添加 Quest 支持:遵循下方 Setup Workflow,不要自动安装 location 或 notifications 包,并 webfetch expo-horizon-core README。
- 决策树·从零开始或给现有 Expo 应用添加 Quest 支持:安装 expo-horizon-core。
- 决策树·从零开始或给现有 Expo 应用添加 Quest 支持:配置 config plugin(horizonAppId、panel size、supportedDevices)。
- 决策树·从零开始或给现有 Expo 应用添加 Quest 支持:添加 quest/mobile build scripts。
- 决策树·从零开始或给现有 Expo 应用添加 Quest 支持:添加运行时设备检测(isHorizonDevice、isHorizonBuild)。
- 决策树·从零开始或给现有 Expo 应用添加 Quest 支持:检测 expo-location / expo-notifications,然后先询问再迁移。
- 决策树·需要 Quest 上的定位服务:webfetch expo-horizon-location README。
- 决策树·需要 Quest 上的定位服务:用 expo-horizon-location 替换 expo-location。
- 决策树·需要 Quest 上的定位服务:查看功能支持矩阵。
- 决策树·需要 Quest 上的定位服务:guard 不支持的调用(heading、geocoding、geofencing、background)。
- 决策树·需要 Quest 上的推送通知:webfetch expo-horizon-notifications README。
- 决策树·需要 Quest 上的推送通知:用 expo-horizon-notifications 替换 expo-notifications。
- 决策树·需要 Quest 上的推送通知:在 expo-horizon-core 中配置 horizonAppId。
- 决策树·需要 Quest 上的推送通知:使用 getDevicePushTokenAsync(Expo Push Service 不支持)。
- 决策树·需要 Quest 上的推送通知:跳过 badge counts(Quest 不支持)。
- 决策树·需要为 Quest 构建、运行或发布:webfetch expo-horizon-core README(build variants)和下方 Meta 文档。
- 决策树·需要为 Quest 构建、运行或发布:使用 build variants:questDebug、questRelease、mobileDebug、mobileRelease。
- 决策树·需要为 Quest 构建、运行或发布:使用 Meta Quest Developer Hub(设备管理、sideloading)。
- 决策树·需要为 Quest 构建、运行或发布:满足 Meta Horizon Store manifest 要求。
- Setup Workflow·第1步:安装并配置 expo-horizon-core;运行 `npx expo install expo-horizon-core`。
- Setup Workflow·第1步:在写入配置前询问用户 config plugin 值;在单个提示中展示所有选项,让用户一次粘贴自定义值或接受默认值;每个选项单独一行并显示默认值。
- Setup Workflow·第1步:询问 supportedDevices,默认 `quest2|quest3|quest3s`,Meta Horizon Store 提交必需。
- Setup Workflow·第1步:询问 horizonAppId,默认空;除非计划使用推送通知;expo-horizon-notifications 发设备推送 token 时需要。
- Setup Workflow·第1步:询问 defaultWidth,默认 `1024dp`;留空则省略。
- Setup Workflow·第1步:询问 defaultHeight,默认 `640dp`;留空则省略;若设置宽高,确保 Expo orientation 匹配,宽面板用 `landscape`。
- Setup Workflow·第1步:询问 disableVrHeadtracking,默认 `false`;设为 `true` 可省略 `android.hardware.vr.headtracking` manifest 条目。
- Setup Workflow·第1步:询问 allowBackup,默认 `false`;Meta 建议敏感数据用 false;仅当需要 Quest 构建中的 Android backup 时设 true。
- Setup Workflow·第1步:仅在用户回复后写入插件配置;用户留空的选项要省略,以便包自带默认值生效;不要为 horizonAppId、defaultWidth、defaultHeight 写空字符串。
- Setup Workflow·第1步:向 package.json 添加 quest / mobile build scripts。
- Setup Workflow·第1步:运行 `npx expo prebuild --clean`。
- Setup Workflow·第1步:在询问前 webfetch expo-horizon-core README 获取当前选项名和默认值,因为默认值可能随版本变化。
- Setup Workflow·第2步:检测已有 location / notification 包;此时不要安装 horizon 等价包。
- Setup Workflow·第2步:读取项目 package.json。
- Setup Workflow·第2步:检查 dependencies 和 devDependencies 中的 expo-location 和 expo-notifications。
- Setup Workflow·第2步:如果两者都不存在,跳过本 workflow 剩余步骤,因为没有迁移要做。
- Setup Workflow·第3步:对每个检测到的包,在迁移前询问用户。
- Setup Workflow·第3步:如果发现 expo-location,询问是否替换为 expo-horizon-location 以便在 Meta Quest 上定位;说明 Quest 没有 GPS、heading、geocoding、geofencing,不支持调用需要用 ExpoHorizon.isHorizonDevice guard。
- Setup Workflow·第3步:如果发现 expo-notifications,询问是否替换为 expo-horizon-notifications 以便在 Meta Quest 上推送通知;说明这需要在 core config plugin 中设置 horizonAppId,使用 Meta 推送服务(不是 Expo Push Service),且不支持 badge counts 或 getExpoPushTokenAsync。
- Setup Workflow·第3步:如果两个包都存在,把问题一起呈现。
- Setup Workflow·第3步:在运行任何安装或编辑这些包之前,等待明确回答。
- Setup Workflow·第4步:仅在用户确认后,对批准的包执行迁移。
- Setup Workflow·第4步:安装 horizon 等价包(`npx expo install expo-horizon-location` 或 `expo-horizon-notifications`)。
- Setup Workflow·第4步:卸载原包(`npm uninstall expo-location` 或 `expo-notifications`)。
- Setup Workflow·第4步:更新所有 import 语句为 horizon 包名。
- Setup Workflow·第4步:对于 notifications,确保 horizonAppId 已在 expo-horizon-core plugin 配置中设置,并将 expo-horizon-notifications 加入 plugins 数组。
- Setup Workflow·第4步:再次运行 `npx expo prebuild --clean`。
- Setup Workflow·第4步:webfetch 相关 README(location 或 notifications)获取完整功能支持矩阵,并把不支持的调用 guard 在 `ExpoHorizon.isHorizonDevice` 后面。
- Setup Workflow·第5步:如果用户拒绝迁移,保持原包不变,并在总结中注明 location / notifications 功能在 quest build 上不会工作,直到迁移。
- Critical Rules:始终先安装 expo-horizon-core;它被所有其他 expo-horizon 包依赖,并设置其他包依赖的 quest/mobile build flavors。
- Critical Rules:永远不要自动安装 expo-horizon-location 或 expo-horizon-notifications;添加 Quest 支持时检测 package.json 中已有 expo-location / expo-notifications 依赖,并询问用户是否逐个迁移;只安装并配置用户明确批准的包。
- Critical Rules:只在 Meta Quest 设备上使用 quest build variants;在标准 Android 手机上运行 questDebug 或 questRelease 不受支持,且会表现异常。
- Critical Rules:在 config plugin 中设置 supportedDevices;这是 Meta Horizon Store 提交必需项;使用 pipe 分隔值:`quest2|quest3|quest3s`。
- Critical Rules:任何 plugin config 变更后运行 `npx expo prebuild --clean`;config plugin 在 prebuild 时修改 native project 文件;陈旧 native project 不会反映变更。
- Critical Rules:迁移时替换 imports,而不仅是包;从 expo-location 或 expo-notifications 迁移时,把所有 import 语句更新为 expo-horizon-location、expo-horizon-notifications。
- Critical Rules:Quest 没有 GPS、磁传感器或 Geocoder;heading、geocoding、reverse geocoding、geofencing 在 Quest 上不可用;用 `ExpoHorizon.isHorizonDevice` 或 `ExpoHorizon.isHorizonBuild` guard 这些调用。
- Critical Rules:推送通知需要 horizonAppId;没有它,getDevicePushTokenAsync 在 Quest 设备上不会返回有效 token;在 Quest 上用 getDevicePushTokenAsync(不是 getExpoPushTokenAsync);把返回的 `{ type: 'horizon', data }` token 发送到后端,并通过 Meta 推送服务投递。
- Critical Rules:区分 isHorizonDevice 与 isHorizonBuild;isHorizonDevice 用于运行时硬件检查(物理 Quest 检测),isHorizonBuild 用于构建时功能 gating(哪些 native code 被编译进去)。
- Critical Rules:不支持 Expo Go;必须通过 `npx expo prebuild` 使用 custom development builds。
- Official References:如果 HTML 视图不渲染源码,始终 webfetch raw markdown(`raw.githubusercontent.com/...`);raw URL 是 source of truth。
- Official References:仓库概览和包列表查阅 expo-horizon README(https://github.com/software-mansion-labs/expo-horizon/blob/main/README.md)。
- Official References:安装、config plugin 选项、运行时 API、native module 访问查阅 expo-horizon-core README(https://github.com/software-mansion-labs/expo-horizon/blob/main/expo-horizon-core/README.md)。
- Official References:location 迁移、限制、功能支持矩阵查阅 expo-horizon-location README(https://github.com/software-mansion-labs/expo-horizon/blob/main/expo-horizon-location/README.md)。
- Official References:推送通知迁移、token 类型、功能支持矩阵查阅 expo-horizon-notifications README(https://github.com/software-mansion-labs/expo-horizon/blob/main/expo-horizon-notifications/README.md)。
- Official References:三个包在示例应用中的接线查阅 expo-horizon example README(https://github.com/software-mansion-labs/expo-horizon/blob/main/example/README.md)。
- Official References:面板尺寸指南(dp 值、orientation、letterboxing)查阅 Meta Panel Sizing(https://developers.meta.com/horizon/documentation/android-apps/panel-sizing)。
- Official References:发布到 Meta Horizon Store 的 manifest checklist 查阅 Publish Mobile Manifest(https://developers.meta.com/horizon/resources/publish-mobile-manifest/)。
- Official References:设备管理、casting、sideloading、ADB 查阅 Meta Quest Developer Hub(https://developers.meta.com/horizon/documentation/android-apps/meta-quest-developer-hub)。
- Official References:通过 Meta 推送服务做服务端推送投递查阅 Horizon OS push notifications(https://developers.meta.com/horizon/documentation/android-apps/ps-user-notifications/)。
适用边界 · 注意事项
- 项目不面向 Meta Quest / Horizon OS 时不要使用;引入 expo-horizon 包和 Quest 构建变体没有意义。
- 不要期望在 Expo Go 中运行此流程;Expo Go 不受支持,必须使用 custom development builds 和 prebuild。
- 不要在标准 Android 手机上运行 questDebug 或 questRelease 构建;该用法不受支持且行为异常。