Flutter iOS Launch Screen & App Icons
Bewährtes Muster für Flutter-Apps: natives Launch-Logo im ersten Frame, plus Home-Bildschirm Icons, die auf iOS Anpassen → Standard / Dunkel / Klar / Getönt reagieren.
Wann verwenden
- Kaltstart zeigt einen leeren weißen/elfenbeinfarbenen Bildschirm, bevor Flutter lädt
- Benötigt helle + dunkle Launch-Logos, die der System-Darstellung folgen (nicht dem In-App ThemeCubit)
- Benötigt App Icon Dunkel / Getönt / Klar Varianten unter iOS 18+
Wann nicht verwenden
- Nur Android Splash / Flutter In-App SplashScreen
- Nur In-App Theme-Umschaltung (HydratedBloc) – diese steuert nicht LaunchScreen oder SpringBoard Icons
Kritische Regeln (nicht überspringen)
- Launch-Logos müssen lose PNGs im App-Bundle sein, keine Asset Catalog Imagesets. SplashBoard schlägt oft bei
UIImage imageNamedaus Assets.car beim ersten Snapshot fehl → leerer Canvas für 2–3s. - BrandLogo nicht in Assets.xcassets ablegen, wenn der gleiche Basisname als lose Datei existiert – der Katalog gewinnt und das Laden schlägt fehl.
- Hintergrundfarben im LaunchScreen müssen explizit sRGB im Storyboard sein. Benannte Farben (z.B.
LaunchBackground) wechseln oft nicht beim Launch-Snapshot. - Trait-Variation-Key ist
userInterfaceStyle=dark(nichtinterfaceStyle, nichtluminosity=dark). - Launch niemals durch Kopieren eines eigenständigen
ibtoolstoryboardc in eine bereits erstellte.appüberprüfen – das führt zu einem schwarzen Bildschirm. Immerflutter build ios --simulator(oder Gerät) und dann deinstallieren + neu installieren. flutter_launcher_iconsnicht ausführen, nachdem Dark/Tinted hinzugefügt wurden – es überschreibtContents.jsonund entfernt Darstellungen.- Das Home-Icon folgt der iPhone-Darstellung / Anpassen, nicht dem Flutter-Theme. Klar wird von Getönt abgeleitet; es gibt keinen separaten Klar-Slot.
Workflow-Checkliste
Fortschritt:
- [ ] 1. Helle + dunkle Launch-PNGs generieren (@1x/@2x/@3x)
- [ ] 2. In ios/Runner/ kopieren und zu Copy Bundle Resources hinzufügen (pbxproj)
- [ ] 3. Alle BrandLogo*.imageset aus Assets.xcassets entfernen
- [ ] 4. LaunchScreen.storyboard aktualisieren (lose Bildnamen + explizite Farben)
- [ ] 5. Optional: LaunchBackground.colorset für Main.storyboard / SceneDelegate-Übergabe nur
- [ ] 6. AppIcon dark + tinted 1024 generieren (und Home-Größen, wenn Legacy-Einträge behalten werden)
- [ ] 7. AppIcon.appiconset/Contents.json mit luminosity dark + tinted aktualisieren
- [ ] 8. flutter build ios --simulator --debug
- [ ] 9. simctl uninstall + install; Launch <0,5s und Icon-Darstellungen in Assets.car überprüfen
Schritt 1 — Launch-Logos generieren
Verwende scripts/generate_launch_logos.py.
Eingaben:
- Quell-Logo mit dunklem Studio-Hintergrund (typisch
assets/logo/logo.png) - Hell: Schwarz ausgestanzt → zweifarbige Markenfarben erhalten
- Dunkel: Gleiche Alpha-Maske, sattes Gold
#E0B45D(oder Projekt-Primärfarbe) - Größen: 400×363 @1x, 800×727 @2x, 1200×1090 @3x (Seitenverhältnis an Ihr Logo anpassen)
Ausstanzformel (passend zu Flutter SplashLogo, falls vorhanden):
alpha_out = min(255, 4 * (R + G + B), source_alpha)
Ausgabedateien in ios/Runner/:
BrandLogo.png,[email protected],[email protected]BrandLogoNight.png,[email protected],[email protected]
Schritt 2 — Bundle-Ressourcen
In ios/Runner.xcodeproj/project.pbxproj:
PBXFileReference+PBXBuildFilefür alle sechs PNGs hinzufügen- Diese in der Runner-Gruppe und in Copy Bundle Resources auflisten
lastKnownFileType = image.png;@2x/@3xPfade in Anführungszeichen
Lösche ios/Runner/Assets.xcassets/BrandLogo.imageset und BrandLogoNight.imageset, falls vorhanden.
Nach dem Build bestätigen:
# BrandLogo darf NICHT in Assets.car sein; PNGs müssen in Runner.app existieren
find build/ios/iphonesimulator/Runner.app -name 'BrandLogo*.png'
xcrun assetutil --info build/ios/iphonesimulator/Runner.app/Assets.car | grep -i BrandLogo || true
Schritt 3 — LaunchScreen.storyboard
Modernes IB-Format verwenden (toolsVersion ≥ 21701, useTraitCollections, Fähigkeit „Dokumente im Xcode 8-Format gespeichert“).
Muster (vollständige Vorlage: references/launch-storyboard.md):
UIImageViewcontentMode="scaleAspectFit", BildBrandLogo- Variation:
key="userInterfaceStyle=dark" image="BrandLogoNight" - Breite ≈
0,28–0,40des übergeordneten Views (Start ~0,32); Höhe = Breite × Logo-Seitenverhältnis - Zentrierungs-X/Y-Constraints
- Heller Hintergrund explizit sRGB (z.B. Elfenbein
#FFFCF7) - Dunkler Hintergrund Variation explizit sRGB (z.B.
#17120E) <resources>muss beide Bildnamen mit intrinsischen Größen deklarieren
Info.plist: UILaunchStoryboardName = LaunchScreen.
Schritt 4 — Flutter-Übergabe (optional, aber empfohlen)
Weißen Bildschirm verhindern, wenn Flutter übernimmt:
LaunchBackground.colorsetmit heller + dunkler Luminosität (OK für Nicht-Launch-UI)- Main.storyboard VC-Hintergrund → benannte Farbe
LaunchBackground - SceneDelegate / benutzerdefinierter
FlutterViewController:view.backgroundColorundwindow.backgroundColorvonUIColor(named: "LaunchBackground")inviewDidLoad/viewDidLayoutSubviewssetzen
Schritt 5 — App Icon Darstellungen (iOS 18+)
Mit scripts/generate_app_icon_variants.py aus dem 1024 Marketing-Icon (Creme-Hintergrund + Logo) generieren.
| Darstellung | Grafik |
|---|---|
| Standard (Beliebig) | Bestehendes helles Icon |
| Dunkel | Gold-Logo auf dunkler Platte (#17120E) oder transparentem Hintergrund gemäß Apple HIG |
| Getönt | Graustufen: weißes/graues Logo auf Schwarz (System wendet Tönung an) |
| Klar | Automatisch von Getönt abgeleitet – kein Contents.json-Eintrag |
AppIcon.appiconset/Contents.json aktualisieren – siehe references/appicon-contents.md.
Universelle 1024-Einträge mit Einzelgröße bevorzugen:
"appearances": [{ "appearance": "luminosity", "value": "dark" }]
"appearances": [{ "appearance": "luminosity", "value": "tinted" }]
Legacy-Einträge pro Größe für iPhone behalten, falls das Projekt sie noch verwendet; mindestens dunkel/getönt für 60pt @2x/@3x + Marketing 1024 hinzufügen.
Validieren:
xcrun actool ios/Runner/Assets.xcassets --compile /tmp/icons \
--platform iphonesimulator --minimum-deployment-target 15.0 \
--app-icon AppIcon --output-partial-info-plist /tmp/icon-partial.plist
xcrun assetutil --info /tmp/icons/Assets.car | grep -E 'UIAppearanceDark|ISAppearanceTintable'
Die erstellte App sollte AppIcon mit UIAppearanceDark und ISAppearanceTintable auflisten.
Schritt 6 — Auf Simulator überprüfen
flutter build ios --simulator --debug
xcrun simctl uninstall booted <bundle.id>
xcrun simctl install booted build/ios/iphonesimulator/Runner.app
# Start: Logo nach ca. 0,4–0,5 s erwarten (nicht mehrsekündiger leerer Bildschirm)
# Icon: Anpassen → Dunkel / Getönt; ggf. löschen + neu installieren für SpringBoard-Cache
simctl benötigt volle Berechtigungen in sandboxierten Agent-Umgebungen.
rm -rf von SplashBoard-Caches nicht ausführen; Deinstallieren + Neuinstallieren löscht Launch-Snapshots.
Marken-Standardwerte (pro Projekt überschreibbar)
| Token | Standard |
|---|---|
| Heller Launch-Hintergrund | #FFFCF7 |
| Dunkler Launch-Hintergrund | #17120E |
| Dunkles Logo-Gold | #E0B45D |
| Launch-Logo-Breite | 32% des Bildschirms |
| Dunkle Icon-Platte | #17120E |
Fragen Sie den Benutzer nach Marken-Hex-Werten, wenn das Projekt abweicht.
Zusätzliche Ressourcen
- Storyboard-XML-Vorlage: references/launch-storyboard.md
- AppIcon Contents.json-Formen: references/appicon-contents.md
- Launch-Logo-Skript: scripts/generate_launch_logos.py
- Icon-Varianten-Skript: scripts/generate_app_icon_variants.py