Debug APK Release
What's New
feat(ios): enable TestFlight distribution (#234)
Make the iOS app uploadable to App Store Connect and usable via
TestFlight. A mix of Info.plist keys, build config bumps, Xcode
recommended-settings, and targeted cleanup in adjacent files.
Info.plist:
- CFBundleDisplayName = "Music Assistant" (prettier home-screen label
than the smooshed PRODUCT_NAME fallback) - ITSAppUsesNonExemptEncryption = false (skips per-upload dialog; app
uses only standard HTTPS, which is exempt) - NSLocalNetworkUsageDescription: the default server is the .local
hostname 'homeassistant.local' (see Defaults.URI); without this
key, mDNS resolution silently fails on iOS 14+ - NSCameraUsageDescription and NSMicrophoneUsageDescription: Apple's
static binary scan sees these APIs referenced by WebRTC.xcframework
even though the app itself never invokes them - Keys alphabetized
- CFBundleVersion bumped to 2 (build 1 was consumed by a rejected
upload that surfaced the missing purpose strings)
gradle.properties:
- JVM heap 2GB -> 8GB. Release-mode Kotlin/Native compile for
iosArm64 OOMs at 2GB (fine for debug Simulator, not for archive). - Enable parallel execution and local build caching.
Xcode project:
- alwaysOutOfDate = 1 on "Compile Kotlin Framework" script phase
(silences the "runs every build" warning; Gradle already does
up-to-date checking, so declaring outputs would create stale-build
hazards). - Accept Xcode's recommended settings: DEVELOPMENT_TEAM inherited
from project level (removes per-target duplication), String Catalog
symbol generation enabled (no-op today, future-friendly), upgrade
check bumped.
CarPlay cleanup (while touching adjacent files):
- CarPlayContentManager: strip 40+ lines of dead scaffolding from
fetchRecommendations (outer apiClient.sendRequest whose result was
ignored in favor of a direct KmpHelper call), along with the WIP
comments that shipped with it. - CarPlaySceneDelegate: collapse 7 nearly-identical pushXTemplate()
methods into one pushCategoryTemplate(title:fetcher:), driven by
a local category table that pairs icons with fetchers directly
(replaces the integer-index switch). - Remove redundant as? downcast on folder.items (already typed).
Audio codec defaults split per-platform:
- Codecs is now expect/actual. Android keeps its current behavior
(default OPUS, picker shows OPUS/FLAC/PCM); its Concentus-backed
OpusDecoder is real and working. - iOS defaults to FLAC and hides OPUS from the picker. OpusDecoder.ios
is a no-op pass-through stub that returns raw Opus bytes unchanged,
so selecting Opus on iOS produces broken audio. A follow-up will
implement a real iOS Opus decoder and restore parity.
Verified end-to-end: uploaded 1.0 (2) to App Store Connect, processed
to "Ready to Test".
Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com
Important Notes
- This is a debug build — not intended for production use
- Contains debug symbols and logging
- Performance may be slower than release builds
Installation
Download the APK below and install on your Android device.