This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
构建用于电视的 Expo 应用
编辑页面
一份用于构建面向 Android TV 或 Apple TV 目标的 Expo 应用的指南。
警告 并非所有 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
4 requirements
4 requirements
1.
在 macOS 或 Linux 上安装 Node.js (LTS)。
2.
安装 Android Studio Iguana 或更高版本。
3.
在 Android Studio 的 SDK 管理器中,选择你正在使用的 Android SDK 的下拉项(API 版本 31 或更高),并确保选择了一个 Android TV 系统镜像进行安装。对于 Apple silicon, 请选择 ARM 64 镜像。否则,请选择 Intel x86_64 镜像。
4.
安装 Android TV 系统镜像后,使用该镜像创建一个 Android TV 模拟器 (流程与创建 Android 手机模拟器相同)。
Apple TV
3 requirements
3 requirements
1.
在 macOS 上安装 Node.js (LTS)。
2.
3.
tvOS SDK 17 或更高版本不会随 Xcode 自动安装。你可以稍后使用
xcodebuild -downloadAllPlatforms 安装它。
快速开始
生成新项目最快的方法在 Expo 示例仓库中的 TV 示例 中有说明:
- npx create-expo-app MyTVProject -e with-tv你也可以从 TV Router 示例 开始:
- npx create-expo-app MyTVProject -e with-router-tv这会创建一个使用 Expo Router 进行基于文件的导航的新项目,其结构基于 create-expo-app 默认模板。
查看支持哪些库
目前,TV 应用可使用下列库和 API:
- AppleAuthentication
- Application
- Audio
- Asset
- AsyncStorage
- AV
- BackgroundTask
- BlurView
- BuildProperties
- Constants
- Crypto
- DevClient
- Device
- Expo UI
- FileSystem
- FlashList
- Font
- GlassEffect
- Image
- ImageManipulator
- KeepAwake
- LinearGradient
- Localization
- Manifests
- MediaLibrary
- NetInfo
- Network
- Reanimated
- SafeAreaContext
- SecureStore
- Skia
- SplashScreen
- SQLite
- Svg
- SystemUI
- TaskManager
- TrackingTransparency
- Updates
- Video
- VideoThumbnails
TV 也可与 React Navigation、React 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 仓库。
{ %%placeholder-start%%... %%placeholder-end%% "dependencies": { %%placeholder-start%%... %%placeholder-end%% "react-native": "npm:react-native-tvos@0.85-stable" %%placeholder-start%%... %%placeholder-end%% } }
react-native-tvos 的版本必须与你正在使用的 Expo SDK 匹配。例如,Expo SDK 56 使用 React Native 0.85,因此你应当使用上面所示的 react-native-tvos@0.85-stable(最新的 0.85 版本)。请参阅 SDK 兼容性表 以了解应使用的正确版本。
在 SDK 56 及更高版本中,将项目升级到更新的 SDK 版本 也会升级 TV 仓库依赖项。
你需要将 react-native 依赖项从 npx expo install 版本验证 中排除。
{ %%placeholder-start%%... %%placeholder-end%% "dependencies": { %%placeholder-start%%... %%placeholder-end%% "react-native": "npm:react-native-tvos@0.83-stable" %%placeholder-start%%... %%placeholder-end%% }, "expo": { "install": { "exclude": ["react-native"] } } }
react-native-tvos 的版本必须与你正在使用的 Expo SDK 匹配。例如,Expo SDK 55 使用 React Native 0.83,因此你应当使用上面所示的 react-native-tvos@0.83-stable(最新的 0.83 版本)。请参阅 SDK 兼容性表 以了解应使用的正确版本。
警告 如果将一个 Expo TV 项目升级到 SDK 55 或更早版本,
react-native-tvos的版本必须手动升级。它不会通过npx expo install expo@latest --fix自动更新。
警告 如果你在 monorepo 中有多个 Expo 项目,并且其中一个项目已修改为支持 TV,那么所有项目都应按此处所述修改为使用 React Native TV 包,即使其中某些项目并未配置为目标 TV。这样可以避免项目依赖之间可能产生的冲突,同时仍然为所有项目完全支持移动端开发。
2
添加 TV 配置插件
- npx expo install @react-native-tvos/config-tv -- --dev安装后,当满足以下任一条件时,插件会将项目修改为 TV 版本:
- 环境变量
EXPO_TV被设置为1 - 插件参数
isTV被设置为true
请确认该插件出现在 app.json 中:
{ "plugins": ["@react-native-tvos/config-tv"] }
若要在 prebuild 期间查看插件操作的更多信息,可以在运行 prebuild 之前设置 debug 环境变量。(另请参阅我们关于 Expo CLI 环境变量 的文档。)
# 查看所有 Expo CLI 和 config plugin 的调试信息- export DEBUG=expo:*# 仅查看 TV 插件的调试信息- export DEBUG=expo:react-native-tvos:config-tv3
6
7
为 TV 和手机创建 EAS Build 配置
由于 TV 构建可以由环境变量的值来驱动,因此很容易设置 EAS Build 配置,使其从相同源码构建,但目标是 TV 而不是手机。
下面的 eas.json 示例展示了如何扩展现有配置(development 和 preview)以创建 TV 配置(development_tv 和 preview_tv)。
{ "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": {} }
8
示例和演示项目
使用 Ignite CLI 生成的项目,可构建用于移动端或电视。
演示 React Native Skia 在移动端、电视和 Web 上的使用。
演示在移动端、电视和 Web 上使用 TailwindCSS 样式。