跳过主要内容
移动 指南

React Native中的Splash屏幕:2026年完整指南

学习如何在Expo & CLI中实现专业的Splash屏幕。 本指南涵盖了资产准备、原生设置、性能和常见问题。

React Native中的Splash屏幕:2026年完整指南

您在真实设备上点击应用图标,用户会在一瞬间看到白色闪烁、拉伸的Logo或冻结的启动屏幕,随后它会消失,直到有用内容准备好。通常,这就是React Native应用停止感觉像生产级应用的时刻。

一个好的启动屏幕在React Native中不仅仅是品牌问题。它填补了原生启动和第一个有意义的React渲染帧之间的空白。它也迫使您清晰地思考启动顺序、资产准备和Expo Go开发客户端和真实商店构建之间的区别。如果您错过了这个时间点,用户就会马上看到问题。

目录

专业的启动屏幕为什么很重要

用户从主屏幕点击你的应用,启动序列显示一个空白白色框架,直到第一个UI出现。生产环境下,这读起来就像应用不稳定一样。即使React Native仍在后台加载JavaScript包或恢复状态,这个第一印象已经错了。

在React Native中,启动屏幕是应用控制的第一个原生界面。它覆盖了进程启动和第一个可用的React渲染帧之间的过渡。因此,它是一个启动工具,而不是仅仅是一个品牌资产。如果你把握好时机,用户会看到一个稳定的启动体验,感觉很有意图。如果你把它隐藏得太早,用户会看到布局抖动、缺失的字体或一个死的屏幕,直到认证、导航或远程配置赶上。

一位表情担忧的男子正在看他的智能手机上的空白白色屏幕。

启动屏幕实际上在做什么

一个生产环境下的启动屏幕通常需要处理四个启动问题:

  • 盖住原生到JS启动工作: 字体加载、持久会话恢复、特性标志读取和初始导航状态都在竞争第一个帧。
  • 防止视觉抖动: 它避免了系统白色闪烁、未样式化的文本或部分挂载的根视图。
  • 保持启动视觉一致性: 背景颜色和Logo可以与应用程序外壳匹配,使启动过程感到控制。
  • 强制启动决策: 团队必须在移除启动屏幕之前定义“就绪”的含义。

实用规则: 隐藏启动屏幕,当第一个真实屏幕可以清晰地渲染时,而不是在任意延迟后。

这也是Expo管理和裸CLI工作流程开始分离的地方。在Expo管理项目中,启动屏幕设置主要是声明性的,主要的工程决策是何时调用隐藏API,基于应用程序的就绪状态。在裸React NativeCLI项目中,您拥有更多的原生设置,Android和iOS,这给您更多的控制权,但也更容易引入启动闪烁、主题不匹配或平台特定回归。

这种权衡在实际项目中很重要。Expo更快地配置和更容易保持一致性跨环境。裸项目通常是当应用程序已经依赖于自定义原生模块、自定义启动行为或更严格的启动路径控制时的合适选择。

对待启动作为产品质量的一部分的团队通常会与更广泛的UX工作一起审查它,而不是将其视为孤立的原生任务。这与__CAPGO_KEEP_0__的应用程序用户体验指南中所涵盖的相同思维方式。如果您还在评估React Native堆栈的更广泛的应用程序或迁移方案,请参阅 Capgo的应用程序用户体验指南。如果您正在评估React Native堆栈的更广泛的应用程序或迁移方案,请参阅 Nerdify React Native应用程序解决方案 提供有用的生产关注的概述。

准备完美的启动屏幕资产

大多数启动屏幕错误源自设计文件,而不是 code. 如果基础资产有误,任何Android XML或iOS故事板清理都无法挽救它。

最安全的方法是将启动屏幕视为 布局系统,而不是一个全屏幕的单个图片。使用背景颜色加上居中的Logo或插图。它在Android设备、iPhone、平板电脑和更宽的设备方向上都能更可预测地缩放,而不是试图将一个详细的海报式图片放置在每个地方。

一个展示四个设计完美的移动应用启动屏幕资产必备要求的清单。

在编码之前准备什么

从设计开始使用一个干净的源文件。矢量是最佳选择,即使导出的启动资产是PNG。

使用这个清单:

  • 源艺术作品: 保持一个可编辑的源格式(如SVG、AI等)中的主Logo或标志,以便导出资产保持一致。
  • 背景颜色: 在前期就定义精确的背景颜色,并确保它与第一个屏幕或应用程序外壳背景匹配。
  • 安全边距: 确保logo周围留有足够的空白空间,以免在不寻常的比例下,激进的裁剪不会切入设计。
  • 平台变体: 将需要的图像大小导出到工作流程中,而不是将一个文件拉伸到所有地方。
  • 暗色模式审查: 如果您的应用程序支持暗色表面,请确认logo仍然清晰可见于选择的背景上。

Expo的指导是有用的,因为它强调了启动资产现在是构建管道的一部分,而不是后想。它的文档建议使用 1024×1024像素的正方形PNG 作为应用程序图标,并注意到EAS Build可以为使用 npx create-expo-app创建的项目生成所需的大小,这表明了资产生成已经转移到现代工具中,而不是手动重复。

常见的资产错误

最常见的视觉故障是可预测的:

问题 可能的原因 更好的方法
模糊的Logo 从低分辨率的栅格中导出 从矢量源重新导出
裁剪的边缘 艺术作品放置在边界太近 增加安全的填充
拉伸 全屏幕图片强制适应多种屏幕比例 使用背景颜色加上居中的图片
过渡效果不匹配 启动屏幕背景与首屏幕背景不一致 启动屏幕和应用程序外壳颜色保持一致

启动屏幕图片不应包含密集的文本、细节或营销信息。启动屏幕只被短暂浏览,且在严格的原生约束下渲染。

对于频繁发布视觉更新的团队来说,图片管理的重要性不仅仅局限于启动屏幕。同样的习惯也适用于交付包和二进制大小,这就是为什么像 优化图片更新 的指南值得一读的原因。

实用的导出工作流程

在实际项目中,一个有效的设置看起来像这样:

  1. 设计一个居中的组合 在一个平坦的背景上。
  2. 导出一个透明的Logo PNG 如果您的工作流程支持一个单独的背景颜色。
  3. 保持命名的一致性 以便资产交换不会变成猜测。
  4. 在小型和高大的模拟器上进行测试 在绑定启动生命周期之前
  5. 重建资产发生变化 因为启动资源经常在本机缓存中。

最后一点比人们期望的更重要。许多启动屏幕问题看起来像配置错误,但实际上就是过时的本机资产。

使用Expo Go和开发客户端工作流程进行实现

如果您正在使用Expo,首先 expo-splash-screen。它适合管理的工作流程,保持大部分配置声明式,并给你明确的控制权,当splash应该离开时。

https://reactnative.dev/的截图

理解的关键行为很简单。 保持原生splash可见,直到第一个有意义的UI帧准备就绪。 Expo的 SplashScreen API支持的确切模式是 preventAutoHideAsync() 在启动时和 hideAsync() 一旦关键加载完成后,Expo会警告说隐藏太早会在iOS和Android构建中短暂地暴露一个空白屏幕,详见文档中的 Expo splash screen API.

声明式配置原生splash

在Expo项目中,视觉部分通常存放在 app.json 或 app.config.js.

一个典型的 app.json setup 的外观如下:

{
  "expo": {
    "plugins": [
      [
        "expo-splash-screen",
        {
          "backgroundColor": "#111111",
          "image": "./assets/splash-icon.png",
          "imageWidth": 200
        }
      ]
    ]
  }
}

项目设置可能会影响具体的字段,但模式保持一致。您在配置中定义原生启动界面,然后从 JavaScript 控制可见性。

一些实际的选择很重要。

  • 使用背景颜色接近您的初始屏幕 让过渡感感到连续。
  • 保持图片简单 因为启动界面不是展示密集艺术作品的最佳场所。
  • 避免伪造的“品牌延迟” 当应用程序已经准备好时,显示用户在Logo上等待的界面。

根据屏幕准备就绪而不是时间来隐藏启动屏

许多教程经常会走弯路。它们使用 setTimeout,容易演示但不适合生产环境。

使用启动状态代替。一个常见的根级模式如下:

import { useCallback, useEffect, useState } from 'react';
import { View } from 'react-native';
import * as SplashScreen from 'expo-splash-screen';

SplashScreen.preventAutoHideAsync();

export default function App() {
  const [isReady, setIsReady] = useState(false);

  useEffect(() => {
    async function prepare() {
      try {
        // Load fonts
        // Restore auth state
        // Read persisted settings
      } finally {
        setIsReady(true);
      }
    }

    prepare();
  }, []);

  const onLayoutRootView = useCallback(async () => {
    if (isReady) {
      await SplashScreen.hideAsync();
    }
  }, [isReady]);

  if (!isReady) {
    return null;
  }

  return (
    <View style={{ flex: 1 }} onLayout={onLayoutRootView}>
      {/* Your real app UI */}
    </View>
  );
}

两个细节使这个模式可靠。

首先, preventAutoHideAsync() 在应用开始渲染有意义的UI之前会调用此函数。其次,隐藏只发生在根视图准备好布局后,这降低了原生启动屏和React树之间的闪烁的机会。

不要在异步工作完成时隐藏启动屏。隐藏它当UI依赖于该工作时才能渲染。

这个区别在启动包括身份验证恢复、远程配置或字体加载时最为重要。如果主屏幕依赖于自定义字体和已签名的状态,启动屏应该覆盖这个间隙。

以下是React Native的更广泛的落地和启动生态系统的有用指南:

在Expo Go和开发构建中预期的内容

Expo添加了一个额外的复杂性。您期望在独立构建中看到的启动屏行为可能与在Expo Go中看到的不符。

这个不匹配会迷惑很多团队。您更改资产或时间逻辑,测试在Expo Go中,然后结论配置是有问题的,而实际问题是开发环境不像生产二进制文件一样行为。

使用这个思维模型:

  • Expo Go 方便迭代 但它并不是原生启动屏幕行为的最后权威。
  • 开发客户端更接近现实 因为它们包含了生成的原生项目。
  • 独立构建是最终检查 启动时间、主题行为和资产正确性。

如果您的启动屏幕仍然闪烁或延迟,通常是由于以下原因:隐藏太早、渲染 null 太长时间后隐藏,或者测试环境不反映发布行为。

配置裸露的 React Native CLI 项目

裸露的 React Native 应用程序给您直接控制启动行为的权力,这在启动屏幕需要匹配真实的启动工作而不是显示 logo 时很有用。这种控制权伴随着原生责任。您必须正确地连接 Android 和 iOS、频繁重建并测试原生启动 UI 和第一个 React 屏幕之间的交互。

在 CLI 项目中,我通常建议 react-native-bootsplash 用于新工作。它比旧的启动屏幕库更适合当前的 React Native 项目,而且原生设置在升级时更容易理解。旧的应用程序仍然使用 react-native-splash-screen所以,在维护工作中,你会遇到它,但对于一个新的设置,目标仍然是相同的。展示一个本地启动界面,直到应用程序可以渲染有意义的UI后才隐藏它。

A four-step infographic illustrating the process for setting up a splash screen in React Native CLI.

Android设置在一个裸项目中

Android splash设置生活在几个地方:主题资源、绘图、 AndroidManifest.xml,和 MainActivity. 这个分裂是为什么小的错误会产生可见的闪烁。

通常的流程是简单的:

  1. 为Android资源文件夹生成启动屏幕资产。
  2. 定义一个启动主题,正确的背景颜色和启动绘图。
  3. 将该主题应用到启动器活动中 AndroidManifest.xml.
  4. 初始化启动屏幕在 MainActivity.
  5. 在JavaScript中隐藏它,直到启动任务阻塞首次渲染完成后。

简化 MainActivity.kt 一种简化的

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // initialize splash handling here depending on the library
}

模式通常呈现如下:

因为具体的调用方式取决于所使用的库,所以这个snippets是故意写得通用化的。原生集成点通常是容易的。错误往往来自资源和主题转换。

  • 在生产环境中出现的Android问题如下: 主题不匹配:
  • 如果启动主题的背景色与应用的第一个屏幕不一致,用户会在切换时看到闪烁。 资产桶不正确:
  • Android会将缺少的预期密度文件夹中的资产拉伸或模糊。 仅使用Metro进行测试:
  • 原生资源更改通常需要重新编译。热重载不会验证启动行为。 Android 12启动规则:
  • 慢JS隐藏后: 如果React在根视图可以绘制之前隐藏启动屏幕,用户会看到一个空白框架而不是smooth过渡。

最后一点比图像本身更重要。时间问题通常被认为是性能问题。

iOS设置在一个裸项目中

在iOS上,重心在 LaunchScreen.storyboard 加上一个小的本机钩子在 AppDelegate该平台期望启动屏幕是静态的和轻量的。将其视为第一屏的视觉结构快照,而不是一个小型引导流程。

可靠的设置如下:

  • 将资产添加到Xcode资产目录。
  • 配置 LaunchScreen.storyboard 使用简单的约束。
  • 保持布局静态。背景颜色、Logo和安全间距通常足够。
  • 添加库的本机启动调用 AppDelegate.
  • 仅在应用完全准备好渲染后,从 JavaScript 隐藏启动屏幕。

新到 iOS 的团队经常会对 storyboard 进行过度设计。通常会出现后果。复杂的约束、多层嵌套的视图或尝试动画启动屏幕使设置变得难以维护并更容易在不同设备大小上破坏。

使用简单的启动屏幕更安全。

仅有 CLI 给你对交接的更多控制权

这是 Expo 管理和仅有 CLI 之间的关键区别。Expo 给你一个更快的路径来获得正确的默认值。仅有 CLI 给你对本机启动管道的完全责任。

这种权衡在启动时做的工作超过仅仅加载一个捆绑包时变得有用。需要额外控制的应用通常包括身份验证恢复、加密存储读取、自定义本机 SDK 初始化或白标品牌规则。仅有项目让你将启动屏幕的时序与这些工作对齐,而不是强制所有内容通过更高级别的配置。

如果你计划在启动后添加动画过渡,请将本机启动屏幕保持静态,将运动移动到第一个 React 屏幕。性能权衡与任何移动启动路径中的问题类似。首次绘制期间进行大量工作很昂贵。这 关于 Capacitor 应用动画性能的指南 从另一个堆栈中讲述的相同原则在 React Native 中也同样适用。

Expo 管理和仅有 CLI

实用比较更关注的是启动复杂度的位置而不是图像显示。

关键决策点 Expo管理 裸 CLI
设置速度 更快的初始设置 更多本地工作
本地定制 更受限制 完全控制
资产生成流程 更声明式 更多手动
调试表面 JS 配置加上生成的原生层 直接 Android 和 iOS 文件
最佳匹配 优化速度和一致性的团队 优化速度和一致性的团队

If the app is already in Expo and the launch requirements are standard, staying there usually saves time. If the startup path depends on native initialization order, custom themes, or platform-specific boot logic, bare CLI is often the cleaner long-term choice.

如果应用程序已经在 Expo 中,并且启动要求是标准的,保持在那里通常会节省时间。如果启动路径依赖于原生初始化顺序、自定义主题或平台特定的引导逻辑,裸 __CAPGO_KEEP_0__ 通常是更长期的清洁选择。

两种工作流程都可以发布一个精致的启动屏幕。区别在于谁拥有启动管道,框架还是团队。

动画启动屏幕看起来精致时,它尊重启动管道。它看起来便宜时,它会分散注意力。

所以我把动画当作增强层,而不是基础。第一项任务仍然是时间。如果应用程序还没有准备好,启动屏幕就会停留。如果应用程序已经准备好,过渡应该快速进入第一个可用的屏幕。

动画应遵循启动现实

常见模式是保持原生启动界面简单,然后在首屏React后运行轻量级品牌动画。这样做比试图在启动界面本身上动画更具灵活性。

由于Lottie可以在首屏中不构建重型自定义动画堆栈的情况下传递运动,因此它是这种手上的实用选择。关键部分是排列:

  • 原生启动界面在关键启动工作期间保持可见。
  • React在首屏或控制过渡屏上挂载第一个真正的屏幕。
  • 可选动画仅在不阻塞交互时间超过必要时才播放。

不起作用的是旧 setTimeout(2000) 模式。快速设备上会让应用等待无原因,慢设备上往往只是将一个加载状态替换为另一个。

启动应视为协调

更好的思维模型是 启动协调。启动界面应覆盖必须完成的任务才能显示有意义内容的确切任务。

通常包括一些混合内容:

  • 认证引导: 恢复会话或决定是否路由到登录页面。
  • 必备存储读取: 主题、语言、引导状态和最后已知的关键偏好。
  • 字体就绪: 尤其是如果第一个屏幕依赖于自定义字体来实现布局稳定性。
  • 远程配置,控制UI: 只有在第一个屏幕无法安全地渲染而不依赖它时才会出现。

还有另一个细微差别,很多教程都忽略了这一点。启动屏幕行为会根据环境而变化。关于Expo启动屏幕在开发和生产环境下的处理 指出在Expo Go中启动屏幕的行为可能与在独立构建中不一样,而且一旦您手动控制,自动可见性管理就会改变。这就是为什么延迟示例会过时的原因。它们隐藏了实际的启动序列,而不是与其对齐。 在开发和生产环境下

一个启动屏幕不应该用来欺骗用户速度。它应该用来防止用户看到未完成的UI。

如果您正在添加混合堆栈中的动画或评估更广泛的渲染性能 这篇关于Capacitor应用动画性能的指南 是有用的上下文,因为同样的原则适用。保持启动工作简洁,避免不必要的阻塞,让动画支持响应性而不是与之竞争。

团队在外部发布完整二进制文件时,需要注意以下实践: Capgo 处理JavaScript、CSS、复制、配置和资产更新的Capacitor和Electron应用,但React Native中的原生启动屏幕仍然属于原生构建管道,因为真正的启动屏幕在JavaScript应用启动之前就已经出现了。

解决常见的启动屏幕问题

大多数启动屏幕问题都属于重复犯错的范畴。分离 资产问题, 时间问题, 原生集成问题.

社区模式 show 在最近的React Native指南中,社区模式已经趋同于核心流程:添加库,配置native启动资产,调用 MainActivity 启动时 LaunchScreen.storyboard and AppDelegateplus XML或drawable资源,而iOS则集中在 和 context npx create-expo-app。该概述还指出Expo推荐一个正方形 1024×1024 PNG.

用于应用图标,并且EAS Build可以为使用

Symptom: Logo看起来模糊、裁剪或不规则缩放。

原因: 基准图像未正确导出,或者布局依赖于全屏像素图像,但不适应。

解决方案: 用中心Logo替换海报风格的艺术作品,重新导出从原始设计源,重新生成密度特定的资产,并验证您的Android可绘制或iOS资产目录包含所需的文件。

白屏后隐藏Splash

症状: 原生Splash消失,然后用户看到一个空白框架之前的第一屏幕。

原因: 您的应用程序正在隐藏Splash屏幕,直到根UI可以渲染有意义的内容。

解决方案: 将Splash消失与就绪性相关联,而不是经过的时间。在Expo中,这通常意味着在您的根视图可以布局之前保持Splash。在裸项目中,使用等效模式并确保首次渲染的屏幕不立即阻塞更多的异步工作。

某个平台的启动屏幕丢失

症状: Android显示,iOS不显示,或者反之亦然。

原因: 一个本地侧面没有完全配置。通常是忘记了一个storyboard引用,主题连接问题,或者没有将资产添加到正确的目标中。

解决方案: 逐一检查各个平台的文件。对于Android,检查启动主题和资源引用。对于iOS,确认 LaunchScreen.storyboard在Xcode中确认asset catalog成员资格和应用目标设置。

添加启动屏幕配置后,构建会失败

症状: 在引入库或更改启动屏幕文件后,应用停止编译

原因: Native 项目文件和生成的配置可能会脱离同步,尤其是在插件或资产发生变化后。

解决方案: 清理构建,重新安装依赖项,如果需要,重新构建整个原生项目。如果您在 Expo 中使用生成的原生层,仔细重新生成并验证插件配置。如果您在一个裸应用中,请检查 MainActivity, AppDelegate资源名称和任何 plist 或 manifest 编辑的小差异。

最快的团队将启动屏幕视为发布工程的一部分,而不是一次性视觉任务。尤其是在启动资产、UI 文本或应用外壳行为需要快速更改后,这一点尤其重要。 Capgo gives Capacitor and Electron teams a way to ship JavaScript, CSS, copy, config, and asset fixes on the next launch with rollout controls and rollback support, which is useful when the problem is in the app layer rather than the native launch screen itself.

继续阅读:React Native 中的启动屏幕:2026 年完整指南

如果您正在使用 React Native 中的启动屏幕:2026 年完整指南 来规划原生媒体和界面行为,连接它与 使用 @capgo/capacitor-live-activities 为使用@capgo/capacitor-live-activities的原生能力 @capgo/capacitor-live-activities 在@capgo/capacitor-live-activities的实现细节中 使用@capgo/capacitor-video-player 为使用@capgo/capacitor-video-player的原生能力 @capgo/capacitor-视频播放器 在@capgo/capacitor-video-player的实现细节中,并且 使用@capgo/capacitor-native-navigation 为使用@capgo/capacitor-native-navigation的原生能力

Live updates for Capacitor apps

当一个 web 层 bug 活跃时,通过 Capgo 将修复推送到应用程序,而不是等待几天的应用商店批准。用户在后台接收更新,而原生更改仍在正常审查路径中。

人性化支持从 Martin

立即开始

最新博客

Capgo 给您创建真正专业的移动应用所需的最佳见解。