构建用于电视的 Expo 应用

编辑页面

一份用于构建面向 Android TV 或 Apple TV 目标的 Expo 应用的指南。


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

警告 并非所有 Expo 功能和 SDK 库都可用于 TV。更多详情,请查看 查看支持哪些库

React Native 通过 React Native TV 项目 支持 Android TV 和 Apple TV。这项技术不仅限于 TV,还提供了一个全面的核心仓库分支,支持手机和 TV 目标平台,包括 Hermes 和 Fabric。

在 Expo 项目中将 React Native TV 库作为 react-native 依赖项使用后,它就能够同时面向移动设备(Android、iOS)和 TV 设备(Android TV、Apple TV)。

前置条件

对原生 Android 和 iOS 文件所需的更改很少,并且如果你使用 prebuild,可以通过 config plugin 自动完成。下面列出了 config plugins 所做的更改,你也可以选择手动应用这些更改:

Android

  • 修改 AndroidManifest.xml
    • 移除默认的手机竖屏方向
    • 添加 TV 应用所需的 intent
  • 修改 MainApplication.kt,移除不受支持的 Flipper 调用

iOS

  • 修改 ios/Podfile 以将目标设为 tvOS 而不是 iOS
  • 修改 Xcode 项目以将目标设为 tvOS 而不是 iOS
  • 修改启动画面(SplashScreen.storyboard)以便在 tvOS 上工作

TV 开发的系统要求

Android TV

  • macOS 或 Linux 上的 Node.js (LTS)
  • Android Studio(Iguana 或更高版本)。
  • 在 Android Studio 的 SDK 管理器中,选择你正在使用的 Android SDK 的下拉项(API 版本 31 或更高),并确保已选择一个 Android TV 系统镜像进行安装。(如果是 Apple silicon,请选择 ARM 64 镜像。否则,请选择 Intel x86_64 镜像)。
  • 安装 Android TV 系统镜像后,使用该镜像创建一个 Android TV 模拟器(过程与创建 Android 手机模拟器相同)。

Apple TV

  • macOS 上的 Node.js (LTS)
  • Xcode 16 或更高版本。
  • tvOS SDK 17 或更高版本。(这不会随 Xcode 自动安装。你可以稍后使用 xcodebuild -downloadAllPlatforms 安装它)。

快速开始

生成新项目的最快方法在 Expo 示例仓库中的 TV 示例 中有说明:

Terminal
npx create-expo-app MyTVProject -e with-tv

你也可以从 TV Router 示例 开始:

Terminal
npx create-expo-app MyTVProject -e with-router-tv

这会创建一个使用 Expo Router 进行基于文件的导航的新项目,其结构基于 create-expo-app 默认模板

查看支持哪些库

目前,TV 应用可使用下列库和 API:

TV 也可与 React NavigationReact Native Skia 以及许多其他常用的第三方 React Native 库配合使用。请查看 React Native 目录 以了解更多关于受支持的第三方库的信息。

限制

  • Expo DevClient 库仅在 SDK 54 及更高版本中受支持:
    • Android TV:支持所有操作,与 Android 手机类似。
    • Apple TV:支持使用本地或隧道式 packager 的基本操作。尚不支持 EAS 身份验证以及 EAS 构建和更新列表。

在现有 Expo 项目中集成

下面的步骤说明了将 Expo 项目修改为支持 TV 所需的流程。

1

为 TV 修改依赖项

package.json 中,修改 react-native 依赖以使用 TV 仓库,并将该依赖项从 npx expo install 版本验证 中排除。

警告 react-native-tvos 版本应与所使用的 Expo SDK 版本匹配。例如,Expo SDK 54 使用 React Native 0.81,因此你应使用 react-native-tvos@0.81-stable(最新的 0.81 版本),如下所示。请参阅 SDK 兼容性表 以获取旧版 SDK 应使用的正确版本。

package.json
{ %%placeholder-start%%... %%placeholder-end%% "dependencies": { %%placeholder-start%%... %%placeholder-end%% "react-native": "npm:react-native-tvos@0.81-stable", %%placeholder-start%%... %%placeholder-end%% }, "expo": { "install": { "exclude": [ "react-native" ] } } }

2

添加 TV 配置插件

Terminal
npx expo install @react-native-tvos/config-tv -- --dev

安装后,当满足以下任一条件时,插件会将项目修改为 TV 版本:

  • 环境变量 EXPO_TV 被设置为 1
  • 插件参数 isTV 被设置为 true

请确认该插件出现在 app.json 中:

app.json
{ "plugins": ["@react-native-tvos/config-tv"] }

若要在 prebuild 期间查看插件操作的更多信息,可以在运行 prebuild 之前设置 debug 环境变量。(另请参阅我们关于 Expo CLI 环境变量 的文档。)

Terminal
# 查看所有 Expo CLI 和 config plugin 的调试信息
export DEBUG=expo:*

# 仅查看 TV 插件的调试信息
export DEBUG=expo:react-native-tvos:config-tv

3

运行 prebuild

设置 EXPO_TV 环境变量,并运行 prebuild 以对项目进行 TV 修改。

Terminal
export EXPO_TV=1
npx expo prebuild --clean

注意:建议使用 --clean 参数,如果项目中已存在 Android 和 iOS 目录,则这是必需的。

4

为 Android TV 构建

启动 Android TV 模拟器,并使用以下命令在模拟器上启动应用:

Terminal
npx expo run:android

5

为 Apple TV 构建

运行以下命令,在 Apple TV 模拟器上构建并运行应用:

Terminal
npx expo run:ios

6

撤销 TV 更改并为手机构建

你可以通过取消设置 EXPO_TV 并再次运行 prebuild,撤销 TV 的更改并回到手机开发:

Terminal
unset EXPO_TV
npx expo prebuild --clean

7

为 TV 和手机创建 EAS Build 配置

由于 TV 构建可以由环境变量的值来驱动,因此很容易设置 EAS Build 配置,使其从相同源码构建,但目标是 TV 而不是手机。

下面的 eas.json 示例展示了如何扩展现有配置(developmentpreview)以创建 TV 配置(development_tvpreview_tv)。

eas.json
{ "cli": { "version": ">= 5.2.0" }, "build": { "base": { "distribution": "internal", "ios": { "simulator": true }, "android": { "buildType": "apk", "withoutCredentials": true }, "channel": "base" }, "development": { "extends": "base", "android": { "gradleCommand": ":app:assembleDebug" }, "ios": { "buildConfiguration": "Debug" }, "channel": "development" }, "development_tv": { "extends": "development", "env": { "EXPO_TV": "1" }, "channel": "development" }, "preview": { "extends": "base", "channel": "preview" }, "preview_tv": { "extends": "preview", "env": { "EXPO_TV": "1" }, "channel": "preview" } }, "submit": {} }

示例与演示项目

IgniteTV

使用 Ignite CLI 生成的项目,可构建用于移动端或电视。

SkiaMultiplatform

演示 React Native Skia 在移动端、电视和 Web 上的使用。

NativewindMultiplatform

演示在移动端、电视和 Web 上使用 TailwindCSS 样式。