
Doorlooptijd
1 maand
Team
4 specialisten
Sector
Media, Entertainment & Audio Streaming
Context
Deep Radio is al bijna 20 jaar een begrip binnen de Nederlandse dancescene. Een online radiostation dat 24 uur per dag leeft op energie, beats, shows, classics, nieuwe releases en een community die muziek niet alleen luistert, maar voelt. Voor Deep Radio ontwikkelde Score Agency een native radio-app die veel verder gaat dan een standaard streamknop. De app brengt het complete Deep Radio-gevoel naar iOS, macOS en Android: live luisteren in hoge kwaliteit, direct zien welke track draait, terugkijken naar eerder gedraaide nummers, het volledige weekschema bekijken en naadloos streamen via AirPlay of Chromecast. Wat deze app bijzonder maakt, zit onder de motorkap én in de details die gebruikers meteen voelen. Dynamic Island en Live Activities tonen live wat er draait. Lockscreen en Control Center werken alsof Deep Radio onderdeel is van het besturingssysteem zelf. Deep Radio. We Are Dance.
Deep Radio had een app nodig die de energie van het radiostation vertaalt naar een premium, stabiele en native luisterervaring op iOS, macOS en Android.
Specifieke uitdagingen
- 1De app mocht niet aanvoelen als een standaard radioplayer, maar als een volwaardige merkervaring
- 2Live audio moest stabiel blijven spelen op de achtergrond, ook tijdens dagelijks gebruik
- 3iOS, macOS en Android moesten dezelfde kwaliteit en uitstraling krijgen, zonder de voordelen van native development te verliezen
- 4Now-playing informatie, coverart, showdata en eerder gedraaide tracks moesten realtime beschikbaar zijn
- 5Dynamic Island, Live Activities, lockscreen controls en Control Center moesten native worden ondersteund
- 6Chromecast, AirPlay en lokale playback moesten slim samenwerken zonder dubbele audio of verwarrende states
- 7De app moest netjes omgaan met telefoongesprekken, systeemonderbrekingen, andere audio-apps en netwerkhikkels
- 8De Android-versie moest pixel-parity bieden met iOS, inclusief moderne Material3 UI en native mediabediening
- 9Het platform moest meetbaar zijn met analytics voor playback, trackwissels, casting en interacties
- 10De technische architectuur moest schaalbaar genoeg zijn voor nieuwe features, shows en integraties
Score Agency ontwikkelde een native productlijn waarin performance, platformintegratie en merkbeleving centraal stonden. Voor Apple-platformen bouwden we met SwiftUI, ActivityKit, AVAudioSession, MPNowPlayingInfoCenter, Google Cast en moderne observation APIs. Voor Android realiseerden we dezelfde ervaring native in Kotlin met Jetpack Compose, Material3, Media3 en ExoPlayer.
Native productlijn
Geen generieke wrapper, maar een doordachte productlijn voor iOS, macOS en Android. Apple-platformen zijn opgezet met xcodegen en project.yml, Android is native ontwikkeld in Kotlin met Jetpack Compose en Material3.
Premium live audio
De app ondersteunt background audio mode, een eigen AVAudioSession-configuratie en stabiele live playback. Hierdoor blijft Deep Radio betrouwbaar doorspelen terwijl gebruikers navigeren, multitasken of hun telefoon vergrendelen.
Dynamic Island & Live Activities
Voor iOS 16.1+ ontwikkelden we een eigen ActivityKit widget extension. Compact, expanded en minimal states tonen het Deep Radio-logo, waveform-icoon, LIVE-badge, artiest en titel.
Gedeelde now-playing state
App en widget delen dezelfde live status via DeepFMNowPlayingAttributes. Daardoor blijven Dynamic Island, Live Activities en de app-interface synchroon met wat er daadwerkelijk op de zender draait.
Chromecast-integratie
Met Google Cast SDK 4.8.4, Bonjour discovery via NSBonjourServices en custom GCKMediaMetadata kunnen luisteraars de livestream casten inclusief titel, artiest en 512x512 artwork.
Slim cast session management
Wanneer een cast-sessie start, pauzeert lokale playback automatisch. Bij disconnect hervat de app de lokale stream weer op een logische manier via GCKSessionManager.
Native SwiftUI cast-button
De cast-functionaliteit is verwerkt in een herkenbare SwiftUI knop met SF Symbol tv, gekoppeld aan presentCastDialog(). Daardoor voelt casten native, snel en vertrouwd.
Lockscreen & Control Center
MPNowPlayingInfoCenter en MPRemoteCommandCenter zorgen voor native mediabediening, live stream status, shownaam in het albumveld, elapsed playback time en artwork dat on-demand wordt geschaald via UIGraphicsImageRenderer.
Reconnect zonder frustratie
Een 8 seconden grace period en 15 seconden cooldown voorkomen flapping bij korte netwerkstoringen. De app reageert daardoor rustig, voorspelbaar en professioneel.
Realtime audio visualisatie
De VU-meter is opgebouwd als synthesized animatie op 24 fps met sinusoïdale drift en jitter. Hierdoor werkt de visualisatie ook bij live HLS en MP3-streams zonder afhankelijk te zijn van MTAudioProcessingTap.
DJ scratch-effect
Voor extra merkbeleving bouwden we een scratch-effect met een dubbele AVAudioEngine-opzet: AVPlayer voor de main stream en een aparte engine met AVAudioUnitTimePitch.
Moderne iOS-architectuur
De app gebruikt @Observable en @State op iOS 17+ voor moderne state management zonder Combine-boilerplate. Now-playing en history worden opgehaald met async/await polling.
Platform conditional compilation
Met #if os(iOS) blijven Cast, ActivityKit en Firebase netjes buiten de macOS-build. Zo blijft elke target schoon, onderhoudbaar en platformgericht.
Realtime data-integraties
De app gebruikt de Backstage API voor live trackmetadata en verwerkt het programmaschema van deep.radio via HTML-schedule parsing met Regex voor shownaam, tijd en artwork.
Type-safe analytics
Firebase Analytics is ingericht met type-safe events voor track changes, playback, castgebruik en scratch-interacties. Zo ontstaat inzicht zonder rommelige eventstructuren.
Android parity
De Android-app gebruikt Media3 1.5.0, ExoPlayer, adaptive bitrate streaming, ICY-metadata extractie, MediaSession, MediaSessionService en Coil voor artwork caching.
Techniek & Aanpak
Vergelijkbare uitdaging?
We bespreken graag hoe we jouw project tot een succes kunnen maken.
Neem contact op