{"id":54319,"date":"2024-09-17T10:21:10","date_gmt":"2024-09-17T08:21:10","guid":{"rendered":"https:\/\/www.inovex.de\/?p=54319"},"modified":"2024-11-04T10:06:22","modified_gmt":"2024-11-04T09:06:22","slug":"developing-an-audio-app-for-apple-carplay-lessons-learned","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/","title":{"rendered":"Developing an Audio App for Apple CarPlay &#8211; Lessons learned"},"content":{"rendered":"<p>When developing an app for Apple CarPlay there is not much good documentation online apart from the <a href=\"https:\/\/developer.apple.com\/documentation\/carplay\/\">official Apple documentation<\/a>. After developing a CarPlay audio app for a large media company I want to share some lessons or insights that we learned along the way that are not that easy to find in the <a href=\"https:\/\/developer.apple.com\/documentation\/carplay\/\">official documentation<\/a>.<!--more--><\/p>\n<p>CarPlay apps can be categorized into six different types:: Audio, Communication, EV Charging, Navigation, Parking and Quick Food Ordering. The primary difference between these categories lies in the components that developers can utilize in their apps. However, this article will focus solely on the development of a CarPlay audio app. Please note that the insights shared in this article are based on iOS versions 15 through 17.5.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#CarPlay-simulator\" >CarPlay simulator<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#iOS-differences\" >iOS differences<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#Pagination\" >Pagination<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#CarPlay-limits\" >CarPlay limits<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#Weak-references\" >Weak references<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#CPNowPlayingTemplate\" >CPNowPlayingTemplate<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#CPTemplate\" >CPTemplate<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"CarPlay-simulator\"><\/span>CarPlay simulator<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>There are different methods available for testing a CarPlay application. The most direct approach is to use the app in an actual car with an iPhone, providing a real-world testing environment. However, this may not always be practical. A viable alternative is to buy a portable CarPlay radio for desktop testing. Both of these options offer the benefit of replicating authentic CarPlay conditions, such as having a touch display, as opposed to utilizing CarPlay with a mouse or trackpad.<\/p>\n<p>As for simulators, Xcode&#8217;s standard iPhone simulator has a built-in CarPlay Simulator accessible via \u201cI\/O -&gt; External Displays -&gt; CarPlay&#8230;\u201c. Although convenient, it lacks some real hardware functionalities like the touch display or physical scroll wheel. Some components behave differently than they would in an actual car. For example, the play\/pause button in the fullscreen player doesn&#8217;t accurately reflect the playback state (see screenshot). It seems like the song is paused even though it is playing. On the other side, it is convenient as no extra device is needed and for some use cases like checking if certain list items are displayed, it is acceptable.<\/p>\n<figure id=\"attachment_54648\" aria-describedby=\"caption-attachment-54648\" style=\"width: 712px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-player.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-54648 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-player.png\" alt=\"Fullscreen music player of the CarPlay simulator displaying an incorrect playback state\" width=\"712\" height=\"460\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-player.png 712w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-player-300x194.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-player-400x258.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-player-360x233.png 360w\" sizes=\"auto, (max-width: 712px) 100vw, 712px\" \/><\/a><figcaption id=\"caption-attachment-54648\" class=\"wp-caption-text\">Music player of the CarPlay simulator<\/figcaption><\/figure>\n<figure id=\"attachment_54656\" aria-describedby=\"caption-attachment-54656\" style=\"width: 800px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-54656 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator.png\" alt=\"Dashboard of the CarPlay simulator displaying four apps\" width=\"800\" height=\"460\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator.png 800w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-300x173.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-768x442.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-400x230.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-360x207.png 360w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><figcaption id=\"caption-attachment-54656\" class=\"wp-caption-text\">Dashboard of the CarPlay simulator<\/figcaption><\/figure>\n<p>Apple offers a more authentic CarPlay simulator, which requires a real iPhone connected to a Mac. It behaves just like a car&#8217;s CarPlay system and can be downloaded as part of \u201c<a href=\"https:\/\/developer.apple.com\/download\/all\/\">Additional Tools for Xcode<\/a>\u201c. After launching the simulator only the iPhone needs to be connected by cable and then CarPlay should start automatically after a moment. If not, just press the button to connect and disconnect again. Contrary to the other CarPlay simulator, this one also simulates car controls like the scroll wheel or steering wheel play\/pause button and from my experience behaves just as a real car would.<\/p>\n<figure id=\"attachment_54654\" aria-describedby=\"caption-attachment-54654\" style=\"width: 691px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-54654 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator.png\" alt=\"Dashboard of the extensive CarPlay simulator displaying multiple apps and car controls\" width=\"691\" height=\"668\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator.png 691w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-300x290.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-400x387.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-360x348.png 360w\" sizes=\"auto, (max-width: 691px) 100vw, 691px\" \/><\/a><figcaption id=\"caption-attachment-54654\" class=\"wp-caption-text\">Dashboard of the CarPlay simulator<\/figcaption><\/figure>\n<h2><span class=\"ez-toc-section\" id=\"iOS-differences\"><\/span>iOS differences<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>If your app supports multiple iOS versions, be prepared for some discrepancies. We encountered the following differences:<\/p>\n<p>iOS 15:<\/p>\n<ul>\n<li>The completion block of <span class=\"lang:swift decode:true crayon-inline\">setRootTemplate<\/span> of the interface controller is not called after a root template has been presented. For future iOS versions, this works as expected.<\/li>\n<li>To circumvent this, the delegate method <span class=\"lang:swift decode:true crayon-inline \">templateDidAppear<\/span> can be used which is called for every presented template.<\/li>\n<\/ul>\n<p>iOS 17.4<\/p>\n<ul>\n<li>Starting with this iOS version, it is possible to add subtitles (<a href=\"https:\/\/developer.apple.com\/documentation\/carplay\/cplistimagerowitem\/imagetitles\">apple documentation<\/a>) to <span class=\"lang:swift decode:true crayon-inline\">CPListImageRowItem.<\/span><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Pagination\"><\/span>Pagination<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>When displaying a section with a lot of elements and you don&#8217;t want to fetch all elements at once, the options to implement pagination in CarPlay are limited. Unfortunately, there is no delegate method that informs us whether a certain list element was seen by the user. One idea is to add a <span class=\"lang:swift decode:true crayon-inline \">CPListItem<\/span> that works as a load-more button for the user. For instance, if 20 items are already displayed and you want to add 20 more to the list, creating new <span class=\"lang:swift decode:true crayon-inline\">CPListItems<\/span> for all 40 items would cause the UI to flicker. To prevent this, the previously displayed <span class=\"lang:swift decode:true crayon-inline \">CPListItem<\/span> should be stored, and a new <span class=\"lang:swift decode:true crayon-inline \">CPListItem<\/span> should be created only for the 20 new items. By passing these 40 <span class=\"lang:swift decode:true crayon-inline\">CPListItems<\/span> (20 old and 20 new) to the section, you can avoid any UI flickering.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"CarPlay-limits\"><\/span>CarPlay limits<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>When developing an app in CarPlay one will notice pretty quickly that there is not much room for creativity and that the system is rather restrictive. However, you might not be aware of all restrictions immediately.<\/p>\n<ul>\n<li>In a <span class=\"lang:swift decode:true crayon-inline\">CPTemplate<\/span>, only 500 elements can be displayed and this includes sections and list items. Apple Music appears to not have this restriction, but the rest of us do.<\/li>\n<li>At maximum five templates can be in the view hierarchy simultaneously. A root template already counts as the first screen and this count is only reset when visiting another root template. Presenting the fullscreen player will not reset this count, but count as another screen. If this limit is exceeded, so if the sixth template is presented, the app will crash.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Weak-references\"><\/span>Weak references<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>During development, we observed that a strong reference needs to be kept for the templates that are currently part of the view hierarchy, otherwise they may be dismissed. Therefore, if you encounter issues with templates not being presented, retaining a reference to these templates could solve the problem.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"CPNowPlayingTemplate\"><\/span>CPNowPlayingTemplate<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>This is the component for the fullscreen player in CarPlay and only very little customization is possible here. Most of the UI like the play\/pause, next, previous button, and so on are controlled by <span class=\"lang:swift decode:true crayon-inline\">MPRemoteCommand<\/span>. These commands are also used for controlling the iPhone lock screen player. So the decision whether a next and previous button or a skip a few seconds forward and backward button is displayed depends on which command is enabled. The commands also control the state of the corresponding buttons.<\/p>\n<p>However, you can also add custom buttons in the bottom bar on the screen by creating <span class=\"lang:swift decode:true crayon-inline\">CPNowPlayingButton<\/span> and adding those buttons to the shared template with <span class=\"lang:swift decode:true crayon-inline\">updateNowPlayingButtons()<\/span>.<\/p>\n<figure id=\"attachment_54646\" aria-describedby=\"caption-attachment-54646\" style=\"width: 709px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-player.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-54646 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-player.png\" alt=\"Fullscreen music player of the CarPlay simulator displaying the correct playback state\" width=\"709\" height=\"480\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-player.png 709w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-player-300x203.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-player-400x271.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-player-360x244.png 360w\" sizes=\"auto, (max-width: 709px) 100vw, 709px\" \/><\/a><figcaption id=\"caption-attachment-54646\" class=\"wp-caption-text\">Music player of the CarPlay simulator<\/figcaption><\/figure>\n<h2><span class=\"ez-toc-section\" id=\"CPTemplate\"><\/span>CPTemplate<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>When deciding whether to use a <span class=\"lang:swift decode:true crayon-inline \">CPAlertTemplate<\/span>\u00a0or just the <span class=\"lang:swift decode:true crayon-inline \">emptyViewTitleVariants<\/span> of a <span class=\"lang:swift decode:true crayon-inline \">CPTemplate<\/span>\u00a0you have to be aware that action buttons can only be added to an\u00a0alert template and that an empty view of a template can only display text and often might not serve as a good option for handling an error state.<\/p>\n<figure id=\"attachment_54652\" aria-describedby=\"caption-attachment-54652\" style=\"width: 710px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-alert.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-54652 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-alert.png\" alt=\"A CPAlertTemplate of CarPlay containing a title and a CPAlertAction\" width=\"710\" height=\"460\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-alert.png 710w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-alert-300x194.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-alert-400x259.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-simulator-alert-360x233.png 360w\" sizes=\"auto, (max-width: 710px) 100vw, 710px\" \/><\/a><figcaption id=\"caption-attachment-54652\" class=\"wp-caption-text\">A CPAlertTemplate of CarPlay<\/figcaption><\/figure>\n<figure id=\"attachment_54650\" aria-describedby=\"caption-attachment-54650\" style=\"width: 711px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-emptyscreen.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-54650 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-emptyscreen.png\" alt=\"The emptyViewTitleVariants of a CPTemplate with a tab title\" width=\"711\" height=\"480\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-emptyscreen.png 711w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-emptyscreen-300x203.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-emptyscreen-400x270.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-emptyscreen-452x304.png 452w, https:\/\/www.inovex.de\/wp-content\/uploads\/carplay-pro-simulator-emptyscreen-360x243.png 360w\" sizes=\"auto, (max-width: 711px) 100vw, 711px\" \/><\/a><figcaption id=\"caption-attachment-54650\" class=\"wp-caption-text\">The empty state of a CPTemplate<\/figcaption><\/figure>\n<p>If you are interested in developing an app for CarPlay or need any help along the way, feel free to reach out to us at <a href=\"https:\/\/inovex.de\/\">inovex<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When developing an app for Apple CarPlay there is not much good documentation online apart from the official Apple documentation. After developing a CarPlay audio app for a large media company I want to share some lessons or insights that we learned along the way that are not that easy to find in the official [&hellip;]<\/p>\n","protected":false},"author":340,"featured_media":58211,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[],"service":[420],"coauthors":[{"id":340,"display_name":"Fabian Rapp","user_nicename":"frapp"}],"class_list":["post-54319","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","service-apps"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Developing an Audio App for Apple CarPlay - Lessons learned - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Lessons learned from developing an audio app for Apple CarPlay.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Developing an Audio App for Apple CarPlay - Lessons learned - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Lessons learned from developing an audio app for Apple CarPlay.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-17T08:21:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-04T09:06:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Fabian Rapp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app-1024x601.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fabian Rapp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Fabian Rapp\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/\"},\"author\":{\"name\":\"Fabian Rapp\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a8fed69c5da85ab70eaf491734e17f1f\"},\"headline\":\"Developing an Audio App for Apple CarPlay &#8211; Lessons learned\",\"datePublished\":\"2024-09-17T08:21:10+00:00\",\"dateModified\":\"2024-11-04T09:06:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/\"},\"wordCount\":1084,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/carplay_audio_app.png\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/\",\"name\":\"Developing an Audio App for Apple CarPlay - Lessons learned - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/carplay_audio_app.png\",\"datePublished\":\"2024-09-17T08:21:10+00:00\",\"dateModified\":\"2024-11-04T09:06:22+00:00\",\"description\":\"Lessons learned from developing an audio app for Apple CarPlay.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/carplay_audio_app.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/carplay_audio_app.png\",\"width\":1500,\"height\":880,\"caption\":\"Grafik zu CarPlay Audio App\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/developing-an-audio-app-for-apple-carplay-lessons-learned\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developing an Audio App for Apple CarPlay &#8211; Lessons learned\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a8fed69c5da85ab70eaf491734e17f1f\",\"name\":\"Fabian Rapp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-Fabian-96x96.pngf0fbea1d0545ea02be4c3338ae837f8a\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-Fabian-96x96.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-Fabian-96x96.png\",\"caption\":\"Fabian Rapp\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/frapp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Developing an Audio App for Apple CarPlay - Lessons learned - inovex GmbH","description":"Lessons learned from developing an audio app for Apple CarPlay.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/","og_locale":"de_DE","og_type":"article","og_title":"Developing an Audio App for Apple CarPlay - Lessons learned - inovex GmbH","og_description":"Lessons learned from developing an audio app for Apple CarPlay.","og_url":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2024-09-17T08:21:10+00:00","article_modified_time":"2024-11-04T09:06:22+00:00","og_image":[{"width":1500,"height":880,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app.png","type":"image\/png"}],"author":"Fabian Rapp","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app-1024x601.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Fabian Rapp","Gesch\u00e4tzte Lesezeit":"5\u00a0Minuten","Written by":"Fabian Rapp"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/"},"author":{"name":"Fabian Rapp","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a8fed69c5da85ab70eaf491734e17f1f"},"headline":"Developing an Audio App for Apple CarPlay &#8211; Lessons learned","datePublished":"2024-09-17T08:21:10+00:00","dateModified":"2024-11-04T09:06:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/"},"wordCount":1084,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app.png","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/","url":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/","name":"Developing an Audio App for Apple CarPlay - Lessons learned - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app.png","datePublished":"2024-09-17T08:21:10+00:00","dateModified":"2024-11-04T09:06:22+00:00","description":"Lessons learned from developing an audio app for Apple CarPlay.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/carplay_audio_app.png","width":1500,"height":880,"caption":"Grafik zu CarPlay Audio App"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/developing-an-audio-app-for-apple-carplay-lessons-learned\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Developing an Audio App for Apple CarPlay &#8211; Lessons learned"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a8fed69c5da85ab70eaf491734e17f1f","name":"Fabian Rapp","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-Fabian-96x96.pngf0fbea1d0545ea02be4c3338ae837f8a","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-Fabian-96x96.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-Fabian-96x96.png","caption":"Fabian Rapp"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/frapp\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/54319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/340"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=54319"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/54319\/revisions"}],"predecessor-version":[{"id":58941,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/54319\/revisions\/58941"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/58211"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=54319"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=54319"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=54319"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=54319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}