CarPlay Audio App Template in SwiftUI: How It Works
Apple gives you the templates; you supply the data. And you need the audio entitlement before any of it ships.
TL;DR
A CarPlay audio app is not custom SwiftUI on the car screen. CarPlay audio apps are template-based: Apple provides safe, fixed templates (lists, now-playing, tab bar) and you populate them with your content, while your phone app stays SwiftUI. Two things gate it: you must request the CarPlay audio entitlement from Apple before you can build against it, and you drive playback through MediaPlayer and the now-playing system. Start your phone app from a clean SwiftUI layout, like a free VP0 design at $0, and add the CarPlay scene on top.
A CarPlay audio app surprises most people the first time, because you cannot draw custom SwiftUI on the car screen. For driver safety, Apple controls the in-car UI: CarPlay audio apps are template-based, so Apple gives you a fixed set of safe templates and you populate them with your content. Your phone app is still ordinary SwiftUI. On top of that, the whole thing is gated by an entitlement you must request from Apple. Here is the real architecture and how to start without going down a wrong path. For the phone-side screens, begin from a free VP0 design (the free iOS and React Native design library AI builders read from) at $0.
Templates, not custom views
The core idea: you do not lay out the car screen, you describe it with CarPlay templates. For an audio app the building blocks are a tab or list of content, an item list, and the now-playing screen.
| Layer | What you build | Where |
|---|---|---|
| Phone app | Full SwiftUI UI | Your normal app |
| CarPlay scene | CPTemplate objects (list, now-playing, tab bar) | A separate scene |
| Content | Map your data into template items | Shared with the app |
| Playback | AVAudioSession + now-playing info | iOS audio stack |
Apple’s CarPlay design guidance explains why the templates are fixed: the driver must not face a novel, distracting interface. So you spend your effort on content and playback, not pixels.
The entitlement gate
This is the step people miss. You must request the CarPlay audio entitlement from Apple through the developer portal before you can build and run a CarPlay scene; it is a request to Apple, not a switch you toggle. Plan for it early, because shipping is blocked until it is granted. Until then you can structure the code, but the CarPlay scene will not activate.
Playback is your normal audio stack
CarPlay does not have its own playback API. You play audio with an AVAudioSession, then publish now-playing metadata and remote command handlers through the MediaPlayer framework so the car’s hardware controls (play, pause, skip) and the now-playing template work. In other words, get your audio and now-playing system right on the phone first, and CarPlay mostly reflects it. The existing Apple CarPlay audio app UI template and CarPlay audio player template for iOS cover the phone-side player UI you build alongside.
Test in the simulator first
Xcode ships a CarPlay Simulator: run on the iOS Simulator, open the external CarPlay display, and your CarPlay scene shows there (the entitlement still has to be in place for the scene to activate). It is enough to validate navigation and template layout; do final checks on real hardware. The same tight-space, constrained-surface discipline that keeps text readable in React Native text cut off on iPhone SE applies here, and if your app also navigates, Mapbox navigation in React Native UIs covers the map side (note CarPlay navigation uses its own map templates and a separate entitlement).
The one CarPlay category that draws its own pixels, navigation, with system maneuver chrome above your map, is covered in the navigation overlay guide.
Key takeaways
- CarPlay audio apps are template-based; you fill Apple’s templates, you do not draw custom views.
- Request the CarPlay audio entitlement from Apple early; shipping is blocked without it.
- Playback is your normal
AVAudioSessionplus MediaPlayer now-playing info and remote commands. - Test with the Xcode CarPlay Simulator, then validate on real hardware.
- Build the phone-side audio screens from a free VP0 design at $0.
Frequently asked questions
Can I build a custom SwiftUI UI for CarPlay?
No, not for audio apps. CarPlay audio apps are template-based: Apple supplies a fixed set of safe templates (list, now-playing, tab bar, grid) and you fill them with your data, because the system controls the in-car UI for driver safety. Your phone app is still SwiftUI; CarPlay is a separate scene built from CPTemplate objects, not arbitrary views.
Do I need an entitlement to make a CarPlay app?
Yes. You must request the appropriate CarPlay entitlement from Apple (for an audio app, the CarPlay audio entitlement) through the developer portal before you can build and run against CarPlay. Without it the CarPlay scene will not activate. Plan for this early, because it is a request to Apple, not a checkbox you flip yourself.
How does audio playback work in a CarPlay app?
Playback runs through your app’s audio stack and the MediaPlayer now-playing system, not through CarPlay-specific playback code. You set up an AVAudioSession, play audio, and publish now-playing info and remote command handlers so the car’s controls (play, pause, skip) and the now-playing template work. CarPlay shows the templates; the audio engine is your normal iOS audio.
How do I test a CarPlay app without a car?
Use the CarPlay Simulator that ships with Xcode: run your app on the iOS Simulator, open the external CarPlay display, and your CarPlay scene appears there. You still need the entitlement for the scene to activate. The simulator covers layout and navigation; final validation should happen on real hardware.
What is the best way to start a CarPlay audio app?
Build the phone app from a clean SwiftUI layout, request the CarPlay audio entitlement, and add a CarPlay scene that maps your content into Apple’s templates. A free VP0 design, the free iOS and React Native design library for AI builders, gives you the phone-side audio screens to generate in Cursor or Claude Code at $0.
What VP0 builders also ask
Can I build a custom SwiftUI UI for CarPlay?
No, not for audio apps. CarPlay audio apps are template-based: Apple supplies a fixed set of safe templates (list, now-playing, tab bar, grid) and you fill them with your data, because the system controls the in-car UI for driver safety. Your phone app is still SwiftUI; CarPlay is a separate scene built from CPTemplate objects, not arbitrary views.
Do I need an entitlement to make a CarPlay app?
Yes. You must request the appropriate CarPlay entitlement from Apple (for an audio app, the CarPlay audio entitlement) through the developer portal before you can build and run against CarPlay. Without it the CarPlay scene will not activate. Plan for this early, because it is a request to Apple, not a checkbox you flip yourself.
How does audio playback work in a CarPlay app?
Playback runs through your app's audio stack and the MediaPlayer now-playing system, not through CarPlay-specific playback code. You set up an AVAudioSession, play audio, and publish now-playing info and remote command handlers so the car's controls (play, pause, skip) and the now-playing template work. CarPlay shows the templates; the audio engine is your normal iOS audio.
How do I test a CarPlay app without a car?
Use the CarPlay Simulator that ships with Xcode: run your app on the iOS Simulator, open the external CarPlay display, and your CarPlay scene appears there. You still need the entitlement for the scene to activate. The simulator covers layout and navigation; final validation should happen on real hardware.
What is the best way to start a CarPlay audio app?
Build the phone app from a clean SwiftUI layout, request the CarPlay audio entitlement, and add a CarPlay scene that maps your content into Apple's templates. A free VP0 design, the free iOS and React Native design library for AI builders, gives you the phone-side audio screens to generate in Cursor or Claude Code at $0.
Part of the Native Hardware, Sensors & Device Features hub. Browse all VP0 topics →
Keep reading
Build a SwiftUI Photo Gallery Grid with Pinch to Zoom
A SwiftUI photo gallery has two pinch gestures: pinch the grid to change density, pinch a photo to zoom. Here is how to build both with LazyVGrid and bounded zoom.
AI Pin Style Voice Interface Animation in SwiftUI: Guide
Building an AI Pin style voice orb in SwiftUI: TimelineView plus Canvas, mic-driven RMS levels, five truthful states, captions, and Reduce Motion support.
Gyroscope 3D Parallax Effect in SwiftUI (Free Start)
Build a tilt-driven gyroscope 3D parallax effect in SwiftUI from a free VP0 design: read CoreMotion attitude, offset layers, smooth jitter, respect Reduce Motion.
iOS Document Picker UI Customization in SwiftUI
Use the iOS document picker in SwiftUI to import and export files from Files and iCloud, from a free VP0 design. With security-scoped access.
Custom Camera UI With AVFoundation in SwiftUI
Build a custom camera UI in SwiftUI with AVFoundation: live preview, capture, and controls, from a free VP0 design. Privacy-first, with the permission string.
Lime Scooter QR Unlock Scanner UI in SwiftUI
The scanner is the easy half. The unlock state machine, where billing starts only on the scooter's confirmation, is the product.