CarPlay Integration Development for iOS Applications
CarPlay is not a separate application. It is an extension of an existing iOS application that displays on the multimedia system screen of a car. Apple strictly limits the categories of applications that can work in CarPlay: navigation, audio, VoIP, messaging, EV charging, parking, gas stations, food and beverages (iOS 17+), and fitness (iOS 16+). Everything else gets rejected in review.
Entitlement and Category Restrictions
The first step is to request a CarPlay entitlement from Apple. Without the com.apple.developer.carplay-* entitlement, the application won't launch in the CarPlay simulator, let alone on a real car. The entitlement is tied to a category: com.apple.developer.carplay-audio, com.apple.developer.carplay-navigation, com.apple.developer.carplay-communication, etc.
The category determines not only the entitlement but also the available UI templates. Navigation uses CPMapTemplate. Audio uses CPNowPlayingTemplate + CPTabBarTemplate. Messaging supports only CPMessageListItem in CPListTemplate. You cannot draw arbitrary UI in CarPlay—only Apple-provided templates.
CarPlay Templates and Their Constraints
CPMapTemplate — for navigation. The application renders the map through CPMapViewController, but CarPlay displays it via CPTemplateApplicationScene. The complexity is that the map must work correctly at different aspect ratios—CarPlay screens range from 7" to 10" with varying aspect ratios. CPMapTemplate provides guidanceBackgroundColor, mapButtons (maximum 4), and a panningInterface for map control.
CPListTemplate — universal list. Maximum 30 items per section, maximum 40 sections. CPListItem supports images, text, detail text, and accessoryImage. Asynchronous image loading works through CPListItem.handler with a callback. If you don't return completion in listItemHandler, the interface freezes.
CPNowPlayingTemplate — singleton, shared across all audio applications. You cannot create multiple instances. MPNowPlayingInfoCenter.default() must be populated before the template appears on screen; otherwise, CarPlay shows an empty player.
Integration with the Main Application
CarPlay runs in a separate UIWindowScene—CPTemplateApplicationScene. The application gains control through CPTemplateApplicationSceneDelegate. This means the main application's AppDelegate or SceneDelegate runs in parallel.
Architecturally correct: the CarPlay scene delegates business logic to the same layer as the main application. A shared AudioPlayerService, a shared NavigationRepository. CarPlay only displays state and sends commands.
A typical mistake: initializing data inside CPTemplateApplicationSceneDelegate—this causes duplicate sessions, playback conflicts, and crashes when switching between phone and CarPlay.
Testing without a real car. Simulator → Features → CarPlay enables a CarPlay window alongside the iPhone simulator. The simulator doesn't replicate all features of a real screen (different sizes, OEM specifics), but it's sufficient for basic development. Final testing happens in a real vehicle or through a MirrorLink adapter.
Process
Request CarPlay entitlement (expect up to 2 weeks of waiting from Apple). Design the flow within available templates—without compromising Apple's requirements. Develop CPTemplateApplicationSceneDelegate and integrate with existing business logic. Test in the simulator and on real hardware.
Timeline
Audio integration (player + queue): 3–5 weeks. Navigation integration with a map: 6–10 weeks. Messaging/VoIP: 4–7 weeks. Cost is calculated after obtaining the entitlement and analyzing the existing application.







