capacitor-splash-screen

Guide to configuring splash screens in Capacitor apps including asset generation, animation, and programmatic control. Use this skill when users need to customize their app launch experience.

By cap-go · 971 installs

npx skills add cap-go/capgo-skills --skill capacitor-splash-screen

Source repository · Upstream listing

Splash Screen in Capacitor When to Use TRIGGER when: Configuring or regenerating splash / icon assets ( npx capacitor assets generate ) Splash never disappears, disappears too early, or flashes white/black before the web app paints Android 12+ shows a small cropped icon on a solid color instead of the full image Upgrading to Capacitor 9 and the Android fade out animation vanished iOS shows a black screen after adding SceneDelegate.swift (8.5+) Do not use: Status bar / navigation bar styling and edge to edge insets: safe area handling Migrating AppDelegate to SceneDelegate: capacitor uiscene migration Slow first paint / bundle size: capacitor performance Icon requirements for store submission: capacitor app store How launch works (decide what to edit) Phase iOS Android 12+ Android <= 11 OS launch screen (before any code) LaunchScreen.storyboard ( UILaunchStoryboardName ), image Splash in Assets.xcassets/Splash.imageset System SplashScreen API: theme AppTheme.NoActionBarLaunch with Theme.SplashScreen parent icon + background color only androidx.core:core splashscreen compat, or android:background drawable Plugin splash (until hide() ) Plugin overlay on the bridge view Same system splash held via the API Plugin ImageView / Dialog ( androidSplashResourceName , androidScaleType ) Most androidScaleType , showSpinner , splashFullScreen , layoutName , useDialog , backgroundColor options do not apply on Android 12+ launch (the OS draws it). They only affect show() and pre 12 devices. Workflow 1. Inspect : capacitor.config. plugins.SplashScreen , android/app/src/main/res/values/styles.xml , android/variables.gradle ( coreSplashScreenVersion ), ios/App/App/Info.plist , ios/App/App/SceneDelegate.swift , assets/ or resources/ folder. 2. Install : npm install @capacitor/splash screen && npx cap sync . 3. Assets : put sources in assets/ ( icon only.png , icon foreground.png , icon background.png , splash.png , splash dark.png ; splash = 2732x2732, icons = 1024x1024), then npm install D @capacitor/assets && npx capacitor assets generate ( ios , android , pwa to scope). Keep the logo inside the center ~1/3 so Android 12+ circular masking does not crop it. 4. Hide deliberately : set launchAutoHide: false and call hide() after the first meaningful render (below). 5. Android 12+ tuning if needed: [references/android 12 splash.md](references/android 12 splash.md). 6. Verify (below). Recommended config Traps: With launchAutoHide: false , a JS crash before hide() leaves the app stuck on the splash. Add a fallback: setTimeout(() = SplashScreen.hide(), 8000) . Default when auto hiding is 500 ms ( launchShowDuration ). Long fixed durations hurt perceived startup; hide on readiness instead. Set <body / root background to the splash background color, or the gap between native splash and first web paint flashes white (dark mode: black). Live updates ( capgo live updates ): call notifyAppReady() independently of hide() ; do not gate one on the other. Version notes Version Change 4 Android uses the Android 12 SplashScreen API + compat library 7 SplashScreenShowOptions / SplashScreenHideOptions types removed ShowOptions / HideOptions 8 coreSplashScreenVersion = '1.2.0' 8.5 (iOS) UIScene template creates the window and CAPBridgeViewController in SceneDelegate ; Main.storyboard no longer supplies the root view controller. LaunchScreen.storyboard is unchanged and still required. 9 Android launchFadeOutDuration default 200 0 (the old default could block UI changes right after hide() ). Set 200 explicitly to keep the fade. iOS notes (Capacitor 8.5+ scenes) Keep UILaunchStoryboardName = LaunchScreen in Info.plist. Apple requires a launch storyboard; deleting it causes letterboxed / wrong size rendering. Do not add views or a custom view controller to Main.storyboard expecting them to show: the 8.5 SceneDelegate sets window.rootViewController = CAPBridgeViewController() in code. Put a custom CAPBridgeViewController subclass there instead. Black screen right after launch with a scene manifest = SceneDelegate creates no window (missing window = UIWindow(windowScene:) + makeKeyAndVisible() ) or UISceneDelegateClassName points to a missing class. Fix with capacitor uiscene migration . The storyboard is cached by iOS. After changing it, delete the app from the device/simulator and reinstall. On resizable windows / iPad / foldables the launch storyboard must use Auto Layout constraints, not fixed frames (see capacitor ios resizability if present). Verification 1. npx cap sync then a clean native build ( Product Clean Build Folder in Xcode; ./gradlew clean in android/ ). 2. Delete and reinstall the app (both platforms cache launch screens). 3. Cold launch on: iOS device light + dark mode, Android 12+ device, Android <= 11 emulator (if minSdk allows; Capacitor 9 minSdk is 26). 4. Confirm: no white/black flash, splash hides once the first screen is visible, fade matches the configured duration. 5. Grep for leftovers: Error Handling Symptom / message Cause Fix Splash stays forever launchAutoHide: false and hide() never runs (JS error, wrong import, called before plugin load) Check web console; add timeout fallback Fade out gone after Capacitor 9 upgrade (Android) Default launchFadeOutDuration is now 0 Set launchFadeOutDuration: 200 UI changes right after hide() not visible (Android, pre 9) 200 ms fade blocked updates Set launchFadeOutDuration: 0 Android 12+ shows small icon, image cropped OS splash is icon only by design Provide adaptive icon safe artwork; tune windowSplashScreenAnimatedIcon Android 12/12L no splash from third party launchers or Android Studio Platform bug fixed in Android 13 Test from the stock launcher error: resource drawable/splash not found androidSplashResourceName or styles reference a missing drawable Regenerate assets or fix the name in both config and styles.xml AAPT: error: style attribute 'attr/windowSplashScreenAnimatedIcon' not found core splashscreen dependency missing Restore implementation "androidx.core:core splashscreen:$coreSplashScreenVersion" iOS black screen after 8.5 scene adoption No window created in SceneDelegate See iOS notes / capacitor uiscene migration Old splash still shows on iOS Launch screen cache Delete app, reboot device if needed, reinstall Resources Plugin API: https://capacitorjs.com/docs/apis/splash screen Splash screens and icons guide: https://capacitorjs.com/docs/guides/splash screens and icons Updating to 9.0: https://capacitorjs.com/docs/updating/9 0 Android SplashScreen API: https://developer.android.com/develop/ui/views/launch/splash screen