Deep Radio – Native radio app for iOS, macOS and Android - Media, Entertainment & Audio Streaming case study door Score Agency
    Alle cases
    Media, Entertainment & Audio Streaming

    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.

    The challenge

    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

    • 1
      The app had to feel like a branded music experience, not a generic radio player
    • 2
      Live audio had to keep playing reliably in the background during everyday use
    • 3
      iOS, macOS and Android needed the same quality and visual consistency without losing native platform benefits
    • 4
      Now-playing information, cover art, show data and recently played tracks had to be available in realtime
    • 5
      Dynamic Island, Live Activities, lockscreen controls and Control Center had to be supported natively
    • 6
      Chromecast, AirPlay and local playback had to work together without duplicate audio or confusing states
    • 7
      The app had to handle phone calls, system interruptions, other audio apps and network issues correctly
    • 8
      The Android version had to match iOS visually and functionally with a modern Material3 interface
    • 9
      Analytics had to measure playback, track changes, casting and user interactions
    • 10
      The technical foundation had to be scalable for future shows, features and integrations
    Our approach

    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.

    Resultaat
    3
    Platforms
    iOS, macOS and native Android
    3 states
    Dynamic Island
    Compact, expanded and minimal
    AirPlay + Cast
    Casting
    Native streaming to speakers, TV and car
    24/7
    Live audio
    Reliable background playback
    24 fps
    Realtime UI
    Synthesized VU meter animation
    Type-safe
    Analytics
    Playback, casting and interactions measured

    Techniek & Aanpak

    SwiftUIxcodegenproject.ymlActivityKitLive ActivitiesDynamic IslandWidget ExtensionAVAudioSessionAVAudioEngineAVPlayerGoogle Cast SDK

    Vergelijkbare uitdaging?

    We bespreken graag hoe we jouw project tot een succes kunnen maken.

    Neem contact op

    Gecertificeerd & Compliant

    Score Agency is ISO 27001 gecertificeerd en volledig AVG/GDPR compliant.