ios: fix blank Live Activity icon by shrinking it from 1024px to 256px - #79
Merged
Merged
Conversation
LiveActivityIcon.imageset was a byte-for-byte copy of the App target's 1024x1024 App Store icon (added in 622e1eb), never resized for its actual ~36pt/108px @3x on-screen size. Live Activities render in a memory-constrained system process, and decoding a 1024x1024 image costs ~4MB per reference — across the three places this asset is drawn (lock screen, Dynamic Island compact leading, minimal), that's enough to blow the budget. The failure is silent: no crash, no build warning, just the icon rendering as a blank box in every presentation while the rest of the layout (text, the rest-state ring drawn from plain SwiftUI shapes) renders fine — exactly what was reported. Resize to 256x256 (~2.4x headroom over 108px) and rename away from the misleading AppIcon-512@2x.png filename that invited the copy-paste in the first place. Also documents the gotcha in MANUAL_SETUP.md so a future icon swap doesn't reintroduce it.
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The workout tracker's Live Activity was showing a blank box where the app icon should be — in the lock-screen banner and in both the compact-leading and minimal Dynamic Island presentations.
Root cause
LiveActivityIcon.imageset/AppIcon-512@2x.pngwas a byte-for-byte copy of the App target's App Store icon (1024×1024, ~530KB), added in622e1eband never resized. It's only ever displayed at ~36pt (108px @3x).Live Activities render in a memory-constrained system process. Decoding a 1024×1024 image costs ~4MB per reference, and this asset is referenced three times (lock screen, Dynamic Island compact leading, minimal) — enough to blow the budget. The failure is silent: no crash, no build warning, just the icon rendering as a blank box in every presentation while the rest of the layout (text, the rest-state ring — plain SwiftUI shapes, no image decode) renders fine.
Confirmed this wasn't a wiring bug first: asset name,
Contents.json, and Xcode target membership were all correct, and the PNG itself decodes fine (rendered it directly — intact panda artwork).Fix
AppIcon-512@2x.pngtoLiveActivityIcon.png, since that filename is exactly what invited copy-pasting the App Store icon in the first place.ios/MANUAL_SETUP.mdso a future icon swap doesn't reintroduce it.Testing
Per
ios/MANUAL_SETUP.md, ActivityKit Live Activities don't render in the iOS Simulator at all, so this can only be verified by eye on a real device via TestFlight — neitherios.yml's Simulator smoke test nor theAppUITestsXCUITest target can render one. Ran an adversarial code review pass on the diff (clean, no findings). The Simulator build (ios.yml) and TestFlight archive (ios-testflight.yml) workflows will validate the project still compiles/archives correctly.🤖 Generated with Claude Code
https://claude.ai/code/session_01QcMBK25upFqN14g4zw7QL7
Generated by Claude Code