| name | axiom-now-playing-carplay |
| description | CarPlay Now Playing integration patterns. Use when implementing CarPlay audio controls, CPNowPlayingTemplate customization, or debugging CarPlay-specific issues. |
| license | MIT |
CarPlay Integration
Time cost: 15-20 minutes (if MPNowPlayingInfoCenter already working)
Key Insight
CarPlay uses the SAME MPNowPlayingInfoCenter and MPRemoteCommandCenter as Lock Screen and Control Center. If your Now Playing integration works on iOS, it automatically works in CarPlay with zero additional code.
What CarPlay Reads
| iOS Component | CarPlay Display |
|---|
MPNowPlayingInfoCenter.nowPlayingInfo | CPNowPlayingTemplate metadata (title, artist, artwork) |
MPRemoteCommandCenter handlers | CPNowPlayingTemplate button responses |
Artwork from nowPlayingInfo | Album art in CarPlay UI |
No CarPlay-specific metadata needed. Your existing code works.
CPNowPlayingTemplate Customization (iOS 14+)
For custom playback controls beyond standard play/pause/skip:
import CarPlay
@MainActor
class SceneDelegate: UIResponder, UIWindowSceneDelegate, CPTemplateApplicationSceneDelegate {
func templateApplicationScene(
_ templateApplicationScene: CPTemplateApplicationScene,
didConnect interfaceController: CPInterfaceController
) {
let nowPlayingTemplate = CPNowPlayingTemplate.shared
nowPlayingTemplate.isAlbumArtistButtonEnabled = true
nowPlayingTemplate.isUpNextButtonEnabled = true
setupCustomButtons(for: nowPlayingTemplate)
}
private func setupCustomButtons(for template: CPNowPlayingTemplate) {
var buttons: [CPNowPlayingButton] = []
let rateButton = CPNowPlayingPlaybackRateButton { [weak self] button in
self?.cyclePlaybackRate()
}
buttons.append(rateButton)
let shuffleButton = CPNowPlayingShuffleButton { [weak self] button in
self?.toggleShuffle()
}
buttons.append(shuffleButton)
let repeatButton = CPNowPlayingRepeatButton { [weak self] button in
self?.cycleRepeatMode()
}
buttons.append(repeatButton)
template.updateNowPlayingButtons(buttons)
}
}
Entitlement Requirement
CarPlay requires an entitlement in your Xcode project:
Info.plist:
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
Entitlements file:
<key>com.apple.developer.carplay-audio</key>
<true/>
Without the entitlement, CarPlay won't show your app at all.
CarPlay-Specific Gotchas
| Issue | Cause | Fix | Time |
|---|
| CarPlay doesn't show app | Missing entitlement | Add com.apple.developer.carplay-audio | 5 min |
| Now Playing blank in CarPlay | MPNowPlayingInfoCenter not set | Same fix as Lock Screen (Pattern 1) | 10 min |
| Custom buttons don't appear | Configured after push | Configure at templateApplicationScene(_:didConnect:) | 5 min |
| Buttons work on device, not CarPlay simulator | Debugger interference | Test without debugger attached | 1 min |
| Album art missing | Same as iOS issue | Fix MPMediaItemArtwork (Pattern 3) | 15 min |
Testing CarPlay
Simulator (Xcode 12+):
- I/O → External Displays → CarPlay
- Tap CarPlay display
- Find your app in Audio section
- Important: Run without debugger for reliable testing (debugger can interfere with CarPlay audio session activation)
Real Vehicle:
Requires entitlement approval from Apple (automatic for apps with UIBackgroundModes audio; no manual request needed).
Verification
Resources
Skills: axiom-now-playing, axiom-now-playing-musickit