如何在 CarPlay 车载仪表盘中支持 Route Guidance

CarPlay 车载仪表盘将音乐、地图和 Siri 建议整合到车内显示屏中,为你带来更安全、更智能的体验。从 iOS 13.4 开始,你也可以在你的导航 App 中添加对 CarPlay 车载仪表盘的支持:通过采用 CarPlay 车载框架内的一些新功能,让你的地图、导航和仪表盘按钮一目了然。

注意:为了将你的 App 与 CarPlay 车载仪表盘融为一体,你的 CarPlay 车载导航 App 需要支持 UIScene。有关采用 UIScene 的更多信息,请查看“iPad 上多窗口简介”

开始使用 CarPlay 车载仪表盘

为了在你的导航 App 中支持 CarPlay 车载仪表盘,你需要更新到 Xcode 11.4

iOS 13.4 提供了 CarPlay 车载框架内的新功能:CPDashboardButtonCPDashboardControllerCPTemplateApplicationDashboardScene

CPTemplateApplicationDashboardScene 是一个新的 UIScene 子类。当 CarPlay 决定你的 App 应该出现在 CarPlay 车载仪表盘中时,它会创建这个子类。

CPDashboardController 和 CPDashboardButton 让你能够管理出现在 CarPlay 车载仪表盘中的控件。

如何添加对 CarPlay 车载仪表盘的支持

为了使用 CarPlay 车载仪表盘,你首先需要支持 CPTemplateApplicationDashboardScene 及其相关协议 CPTemplateApplicationSceneDelegate。

注意:你需要使用 CPTemplateApplicationSceneDelegate 而不是 CPApplicationDelegate 来支持该功能。

下面我们将带你完成每一步。此外,我们还提供了一个 UIApplicationSceneManifest 的例子供你参考。

```xml
<key>UIApplicationSceneManifest</key>
<dict>
    <key>CPSupportsDashboardNavigationScene</key>
    <true/>
    <key>UISceneConfigurations</key>
    <dict>
        <!-- For device scenes -->
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneClassName</key>
                <string>UIWindowScene</string>
                <key>UISceneConfigurationName</key>
                <string>Phone</string>
                <key>UISceneDelegateClassName</key>
                <string>MyAppWindowSceneDelegate</string>
            </dict>
        </array>
        <!-- For the main CarPlay scene -->
        <key>CPTemplateApplicationSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneClassName</key>
                <string>CPTemplateApplicationScene</string>
                <key>UISceneConfigurationName</key>
                <string>CarPlay</string>
                <key>UISceneDelegateClassName</key>
                <string>MyAppCarPlaySceneDelegate</string>
            </dict>
        </array>
        <!-- For the CarPlay Dashboard scene -->
        <key>CPTemplateApplicationDashboardSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneClassName</key>
                <string>CPTemplateDashboardScene</string>
                <key>UISceneConfigurationName</key>
                <string>CarPlay-Dashboard</string>
                <key>UISceneDelegateClassName</key>
                <string>MyAppCarPlayDashboardSceneDelegate</string>
            </dict>
        </array>
    </dict>
</dict>
```

步骤 1:创建一个场景委托

首先,为 CPTemplateApplicationSceneSessionRoleApplication 定义一个场景委托。你可以在你的 UIApplicationDelegate 中,通过在 application:configurationForConnectingSceneSession:options: 中返回一个配置来动态完成,或者提前在你的 Application Scene Manifest 中的 Info.plist 中完成。

这个委托必须遵循 CPTemplateApplicationSceneDelegate,它要被赋予 CPInterfaceController 和 CPWindow 的实例,就像你已熟悉的 CPApplicationDelegate 一样。

此外,为了支持 CPTemplateApplicationDashboardScene,你需要在你的 Application Scene Manifest 中包含一个新的 key 来声明对 CarPlay 车载仪表盘的支持:CPSupportsDashboardNavigationScene,其值为 true。


步骤 2:定义仪表盘委托

接下来,定义你的仪表盘场景的委托,就像你定义主模板应用场景一样。这个委托遵循 CPTemplateApplicationDashboardSceneDelegate,并会被赋予一个 CPDashboardController 和 UIWindow 的实例。