
Deep Radio – Native radio app for iOS, macOS and Android
Deep Radio
Doorlooptijd
1 maand
Team
4 specialisten
Sector
Media, Entertainment & Audio Streaming
Context
Deep Radio has been a leading name in the Dutch dance scene for almost 20 years. It is an online radio station that runs 24 hours a day on energy, beats, shows, classics, new releases and a community that does not just listen to music, but lives it. Score Agency developed a native radio app for Deep Radio that goes far beyond a simple play button. The app brings the full Deep Radio experience to iOS, macOS and Android: high-quality live streaming, instant now-playing information, recently played tracks, a complete weekly schedule and seamless playback through AirPlay or Chromecast. The strength of the app is in the combination of deep technical integration and brand experience. Dynamic Island and Live Activities show what is playing in realtime. Lockscreen and Control Center controls make Deep Radio feel like a natural part of the operating system. Background playback remains stable, network interruptions are handled intelligently and the app works cleanly alongside phone calls and other audio apps. The visual layer also received its own character. Realtime metadata, cover art, a synthesized VU meter and even a DJ scratch effect make the app feel like a true digital extension of the Deep Radio brand instead of a generic radio player. Score Agency did not build one compromised cross-platform app. We built a mature native product line: iOS and macOS with SwiftUI and xcodegen, Android with Kotlin, Jetpack Compose and Material3. The result is fast, reliable and platform-native while keeping the Deep Radio identity consistent everywhere. Deep Radio. We Are Dance.
Deep Radio needed an app that translated the energy of the station into a premium, stable and native listening experience across iOS, macOS and Android.
Specifieke uitdagingen
- 1The app had to feel like a branded music experience, not a generic radio player
- 2Live audio had to keep playing reliably in the background during everyday use
- 3iOS, macOS and Android needed the same quality and visual consistency without losing native platform benefits
- 4Now-playing information, cover art, show data and recently played tracks had to be available in realtime
- 5Dynamic Island, Live Activities, lockscreen controls and Control Center had to be supported natively
- 6Chromecast, AirPlay and local playback had to work together without duplicate audio or confusing states
- 7The app had to handle phone calls, system interruptions, other audio apps and network issues correctly
- 8The Android version had to match iOS visually and functionally with a modern Material3 interface
- 9Analytics had to measure playback, track changes, casting and user interactions
- 10The technical foundation had to be scalable for future shows, features and integrations
Score Agency developed a native product line focused on performance, platform integration and brand experience. For Apple platforms we used SwiftUI, ActivityKit, AVAudioSession, MPNowPlayingInfoCenter, Google Cast and modern observation APIs. For Android we built the same experience natively with Kotlin, Jetpack Compose, Material3, Media3 and ExoPlayer.
Native product line
No generic wrapper, but a carefully designed product line for iOS, macOS and Android. Apple platforms were structured with xcodegen and project.yml, while Android was built natively with Kotlin, Jetpack Compose and Material3.
Premium live audio
The app supports background audio mode, custom AVAudioSession configuration and stable live playback, so Deep Radio keeps playing while users multitask or lock their phone.
Dynamic Island & Live Activities
For iOS 16.1+, we developed a dedicated ActivityKit widget extension. Compact, expanded and minimal states display the Deep Radio logo, waveform icon, LIVE badge, artist and title.
Shared now-playing state
The app and widget share live playback state through DeepFMNowPlayingAttributes, keeping Dynamic Island, Live Activities and the app interface aligned with the station.
Chromecast integration
Using Google Cast SDK 4.8.4, Bonjour discovery through NSBonjourServices and custom GCKMediaMetadata, listeners can cast the live stream with title, artist and 512x512 artwork.
Smart cast session management
When casting starts, local playback automatically pauses. When the session disconnects, the app intelligently resumes local playback through GCKSessionManager.
Native SwiftUI cast button
Casting is exposed through a recognizable SwiftUI button with an SF Symbol tv icon, connected to presentCastDialog() for a familiar platform-native flow.
Lockscreen & Control Center
MPNowPlayingInfoCenter and MPRemoteCommandCenter provide native media controls, live stream status, show name, elapsed playback time and dynamically rendered artwork.
Reconnect without frustration
An 8-second grace period and 15-second cooldown prevent playback flapping during short network interruptions, resulting in a calmer and more reliable experience.
Realtime audio visualisation
The VU meter is built as a synthesized 24 fps animation with sinusoidal drift and jitter, allowing it to work with live HLS and MP3 streams without MTAudioProcessingTap.
DJ scratch effect
The scratch effect uses a dual AVAudioEngine setup: AVPlayer for the main stream and a separate engine with AVAudioUnitTimePitch.
Modern iOS architecture
The app uses @Observable and @State on iOS 17+ for modern state management without Combine boilerplate. Now-playing and history are fetched through async/await polling.
Platform conditional compilation
#if os(iOS) keeps Cast, ActivityKit and Firebase cleanly separated from the macOS build, making each target focused and maintainable.
Realtime data integrations
The app uses the Backstage API for live track metadata and parses the deep.radio schedule with Regex for show names, times and artwork.
Type-safe analytics
Firebase Analytics was implemented with type-safe events for track changes, playback, casting and scratch interactions.
Android parity
The Android app uses Media3 1.5.0, ExoPlayer, adaptive bitrate streaming, ICY metadata extraction, MediaSession, MediaSessionService and Coil for artwork caching.
Techniek & Aanpak
Vergelijkbare uitdaging?
We bespreken graag hoe we jouw project tot een succes kunnen maken.
Neem contact op