Building Splash Screens React Native

A complete guide to implementing professional launch screens for both Expo and React Native CLI projects, with code examples for iOS and Android platforms.

Understanding Splash Screens in React Native

The splash screen--also called a launch screen--is the first visual experience users have when opening your React Native app. While the app initializes and loads initial resources, the splash screen provides immediate feedback, creating a smooth first impression that bridges the gap between tap and interaction.

Why Splash Screens Matter

Splash screens serve multiple purposes beyond aesthetics:

  • User Perception: Research shows that perceived wait time decreases when users see a branded launch screen, reducing frustration and abandonment rates
  • Brand Reinforcement: They provide an opportunity to reinforce brand identity through logos, colors, and imagery
  • Smooth Transitions: They manage the unavoidable delay between launching an app and rendering the first meaningful interface

Two Main Approaches

Expo Approach: Uses the expo-splash-screen library with configuration-based setup, handling native configurations automatically through config plugins. This minimizes native code knowledge requirements.

React Native CLI Approach: Requires manual native file configuration, giving complete control over the implementation but requiring Xcode and Android Studio familiarity.

Our professional web development services include mobile app implementation with best practices for user experience across all platforms.

LogRocket's implementation guide provides detailed code examples for both approaches.

How React Native Apps Load

Understanding the loading sequence helps explain why splash screens are necessary and how to implement them effectively.

The Initialization Sequence

  1. Native Container Start: The iOS or Android process initializes
  2. JavaScript Engine: The JS engine (Hermes or JavaScriptCore) starts up
  3. Bundle Load: The JavaScript bundle downloads or loads from cache
  4. Module Registration: Native modules register with the bridge
  5. Bridge Establishment: Communication between native and JS layers begins

This process typically takes 1-3 seconds depending on device performance and bundle size. Without a splash screen, users would see a blank white screen during initialization.

Native vs JavaScript Splash Screens

AspectNative Splash ScreenJavaScript Splash Screen
Display TimingMilliseconds after app process startsAfter JavaScript bundle loads
CustomizationLimited (storyboard/theme config)Full JavaScript control
ComplexityLow (config-based)Higher (requires JS logic)
Best ForImmediate brandingComplex animations, loading states

Most apps use a two-layer approach: native splash for immediate display, JavaScript splash for extended loading periods.

Expo SplashScreen documentation covers the API details for programmatic control.

Expo Splash Screen Implementation

Key features and capabilities of the expo-splash-screen library

Config Plugin Integration

Automatic native configuration during build process, eliminating manual iOS and Android setup

Dark Mode Support

Separate splash configurations for light and dark system themes

Programmatic Control

API to hide splash programmatically after critical resources have loaded

Image Flexibility

Support for PNG images with transparency, automatic resizing for different screen densities

Expo Splash Screen Configuration

Basic Configuration

Add the following to your app.json or app.config.js:

{
 "expo": {
 "splash": {
 "image": "./assets/images/splash-icon.png",
 "backgroundColor": "#232323",
 "imageWidth": 200,
 "resizeMode": "contain"
 }
 }
}

Configuration Properties

PropertyDescriptionDefault
imagePath to PNG splash iconRequired
backgroundColorBackground fill color#FFFFFF
imageWidthIcon width in density-independent pixels200
resizeMode"contain" or "cover""contain"

Dark Mode Support

{
 "expo": {
 "splash": {
 "image": "./assets/images/splash-icon.png",
 "backgroundColor": "#FFFFFF",
 "dark": {
 "image": "./assets/images/splash-icon-dark.png",
 "backgroundColor": "#000000"
 }
 }
 }
}

Image Requirements

For optimal quality across all devices, use a 1024x1024 PNG source image with a transparent background. Expo only supports PNG format--other image formats will cause production build failures. The image is automatically resized for different screen densities (@2x, @3x, @4x), so starting with a high-resolution source ensures crisp rendering on all devices.

Working with our custom web development team ensures your mobile app assets are properly optimized for production deployments across iOS and Android platforms.

React Native CLI: iOS Implementation

LaunchScreen.storyboard Setup

For React Native CLI projects, iOS splash screens use LaunchScreen.storyboard:

  1. Open ios/YourApp/Base/LaunchScreen.storyboard in Xcode
  2. Add an Image View component to serve as splash logo container
  3. Configure properties: center alignment, Aspect Fit content mode
  4. Add width and height constraints to control display size
  5. Reference images from Assets.xcassets

Key Configuration Points

  • Content Mode: Use "Aspect Fit" to maintain aspect ratio
  • Constraints: Center the image horizontally and vertically
  • Asset References: Ensure images exist in Assets.xcassets
  • Universal Support: Include @2x and @3x variants

Programmatic Control with react-native-splash-screen

import SplashScreen from 'react-native-splash-screen';

componentDidMount() {
 // Hide splash after app is ready
 SplashScreen.hide();
}

LogRocket's storyboard tutorial provides detailed configuration steps and code examples for iOS implementation.

React Native CLI: Android Implementation

Creating launch_screen.xml

Android splash screens use theme configurations and drawable resources:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@color/background_color" />
 <item>
 <bitmap
 android:gravity="center"
 android:src="@drawable/splash_icon" />
 </item>
</layer-list>

Theme Configuration

In android/app/src/main/res/values/styles.xml:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
 <item name="android:windowBackground">@drawable/launch_screen</item>
</style>

Apply this theme to your main activity in AndroidManifest.xml.

Resource Qualifiers

Android supports multiple resource qualifiers for different configurations:

  • drawable-night/ - Dark mode splash resources
  • drawable-port/ - Portrait-specific layouts
  • drawable-xxxhdpi/ - High-density display variants

LogRocket's Android configuration guide provides complete XML examples and theme setup instructions.

Advanced Splash Screen Techniques

Animated Transitions

Static splash screens can feel bland. Consider adding animations:

  • Fade-in: Gentle opacity transitions for logo appearance
  • Scaling: Subtle scale animations to draw attention
  • Lottie Animations: Complex, designer-created animations
import Animated, { FadeIn } from 'react-native-reanimated';

// Animated splash component
const SplashLogo = () => (
 <Animated.Image 
 entering={FadeIn.duration(500)}
 source={require('./logo.png')}
 />
);

For apps requiring intelligent loading sequences and user experience optimization, explore our AI automation services that can enhance app initialization patterns and user engagement.

Programmatic Hiding

Hide the splash at the right moment--not too early, not too late:

useEffect(() => {
 async function prepare() {
 try {
 await loadFonts();
 await initializeAnalytics();
 await cacheCriticalAssets();
 } catch (e) {
 console.warn(e);
 } finally {
 SplashScreen.hide();
 }
 }
 
 prepare();
}, []);

Handling Network-Dependent Launches

For apps requiring network requests:

  • Show loading indicator within app UI (not extended splash)
  • Handle offline states gracefully
  • Display cached content when network unavailable

Best Practice: Avoid Extended Splash Screens

Never extend the splash screen indefinitely. Splash screens should display for 1-3 seconds maximum. If your app needs more initialization time, transition to a proper loading state within your app's UI. Extended splash screens confuse users about whether the app launched successfully and violate platform guidelines from both Apple and Google. Users understand loading indicators within an app interface, but a prolonged splash screen creates uncertainty about app responsiveness.

Testing and Debugging

Common Issues

IssueCauseSolution
White flash after hideSplash hides before render completesDelay hide until after initial render
Incorrect scalingWrong resizeMode or image dimensionsTest across device sizes, adjust config
Images not appearingIncorrect asset paths or missing filesVerify paths, check build bundle
Dark mode not workingMissing dark theme configurationAdd dark config in app.json

Platform-Specific Testing

iOS Testing:

  • Test on multiple device sizes (SE, standard, Pro Max)
  • Verify simulator and physical device behavior
  • Check different iOS versions

Android Testing:

  • Test across manufacturers (Pixel, Samsung, Xiaomi)
  • Verify foldable device behavior
  • Test Android 12+ splash screen APIs

Production Verification Checklist

  • Test in production build (not just development)
  • Verify splash displays within milliseconds
  • Confirm splash hides at appropriate time
  • Test dark mode support on both platforms
  • Verify on physical devices (not just simulators)
  • Check loading states with slow network conditions

Critical: Always Test in Production Builds

Splash screen configuration that works perfectly in development mode may fail or behave differently in production builds. The build process includes asset optimization, code minification, and packaging steps that can affect splash screen behavior. Always test your splash screen implementation in a production build before release. Common production-only issues include missing images that weren't included in the build bundle, incorrect asset paths after bundling, and ProGuard/R8 optimization breaking splash screen libraries.

Need help with comprehensive mobile app testing and quality assurance? Our web development expertise includes end-to-end testing services for React Native applications.

Best Practices and Guidelines

Recommendations for effective splash screen implementation

Minimal Content

Limit to essential brand elements--logo and optional tagline. Don't overwhelm users with information.

Optimized Images

Compress PNG files appropriately. Use 1024x1024 source for sharp rendering across densities.

Quick Hiding

Aim to hide splash within 2-3 seconds. Longer waits should use in-app loading indicators.

Accessibility

Ensure contrast ratios meet WCAG guidelines for users with varying visual capabilities.

Platform Compliance

Follow Apple HIG and Google Material Design guidelines. Avoid deceptive patterns.

Consistent Experience

Match splash screen aesthetic to overall app design language and brand identity.

Frequently Asked Questions

Conclusion

Implementing splash screens in React Native requires understanding both native platform behaviors and the JavaScript-controlled application lifecycle. Whether using Expo's streamlined configuration approach or React Native CLI's native file customization, the goal remains consistent:

  1. Provide immediate visual feedback that your app is launching
  2. Maintain that feedback through the initialization period
  3. Reveal a fully ready interface when the moment arrives

Key Takeaways

  • Choose your approach based on project setup (Expo vs CLI) and team native development experience
  • Use two-layer splash screens: native for immediate display, JavaScript for extended loading
  • Test thoroughly on both platforms and in production builds
  • Follow platform guidelines from Apple and Google
  • Keep it simple: minimal branding, quick transitions, smooth user experience

Related Articles:

Need professional help with your React Native project? Our web development team specializes in building polished, user-friendly mobile applications that make strong first impressions.

Ready to Build Your React Native App?

Our team specializes in cross-platform mobile development using React Native. Let's discuss your project requirements.

Sources

  1. LogRocket: Building Splash Screens in React Native - Comprehensive tutorial covering both Expo and React Native CLI approaches with code examples for iOS and Android native implementation
  2. Expo Documentation: Splash Screen and App Icon - Official Expo guide for splash screen implementation using expo-splash-screen library
  3. NativeLaunch: Expo vs React Native CLI - Comparison between Expo and React Native CLI development approaches