关键词:CarPlay framework; 字数:5k+

前言

本文是对 WWDC20|10635 – Accelerate your app with CarPlay 的梳理。假如你正要构建一款 CarPlay app,那么该 session 你必定不能错失。Apple 在 iOS 14 中为 CarPlay 带来了大更新,新增了电车充电、泊车和快速点餐三种支撑 CarPlay 的 app 类型,并首次将 CarPlay framework 供给给除导航外的其它类型的 app 运用。本文将向你介绍 CarPlay framework 新增的 template 以及对旧 template 的种种改进,并教你运用这些 template 来开发受支撑的各种类型的 CarPlay app。

本文会尽量复原 session 的内容,并适作为一些扩展。假如你想了解更多有关 CarPlay 的内容,能够阅览笔者的 CarPlay 专栏下的其它文章。

概要

Apple 于 iOS 12 首次引入 CarPlay framework 用于也仅限于开发导航类 app。你或许在 CarPlay 中运用过一些优秀的第三方导航 app,如 Waze 和 Google 地图,它们便是依据 CarPlay framework 供给的 template 来构建的。

在 iOS 14 中,Apple 将为 CarPlay 带来如下更新:

  • 新增了电车充电、泊车和快速点餐三种支撑 CarPlay 的 app 类型
  • 首次将 CarPlay framework 供给给除导航外的其它类型的 app 运用。除新增的 app 类型外,你还能够运用 CarPlay framework 晋级你的音频和通讯 CarPlay app
  • 为各种类型的 CarPlay app 新增了一些通用或特定的 template
  • 对一些旧 template 做了种种改进,使其在不同类型的 CarPlay app 中能够发挥不同的效果

|为了便于阅览,本文将依照 app 类型区别目录,读者能够仅阅览自己关怀的 app 类型在 CarPlay 中的更新。

iOS CarPlay|使用 CarPlay 为你的 App 提速

规划原则

首要,咱们来回忆一下在 CarPlay 中构建 app 时应该紧记的一些规划原则。

  • 为驾驭员规划。CarPlay 是为驾驭员而不是为乘客规划的,你应该只在 CarPlay app 中供给有助于驾驭的功用。
  • 简化交互。CarPlay app 是具有针对性的,你的 CarPlay app 应从最常见的场景发动,并简化每个交互操作到能够由驾驭员在几秒内完结。
  • 复用 app 装备。尽或许复用 iPhone app 的装备,以最小化用户在 CarPlay 中需求进行的任何设置操作。用户对你的 app 的初体会应当在开端驾驭之前就已经在 iPhone 端完结了。
  • 去除 app 中依赖于在 iPhone 上发动的任何逻辑。app 或许会首要而且只在 CarPlay 中发动。当用户在 CarPlay 主屏幕上点击你的 app 时,你的 app 将会发动并衔接到一个 car scene,而不会衔接 iPhone scene。因而,去除 app 中依赖于在 iPhone 上发动的任何逻辑十分重要。运用 UIScene 很简略做到这一点。实际上,你的 app 有必要选用 UIScene 才能运用 CarPlay framework。所以,你有必要从传统的 UIWindow 和 UIApplicationDelegate API 向 UIScene 过渡。

iOS CarPlay|使用 CarPlay 为你的 App 提速

CarPlay framework 初体会

前面提到过,你的 app 有必要选用 UIScene 才能运用 CarPlay framework。选用 UIScene 的重要一环是在 info.plist 中为你的 app 声明一份场景清单(Scene Manifest)。

除了 iPhone scene 之外,你还需求在场景清单中供给一个 CarPlay scene 装备,如以下示例所示。

// CarPlay Scene Manifest
<key>UIApplicationSceneManifest</key>
<dict>
    <key>UISceneConfigurations</key>
    <dict>
        <key>CPTemplateApplicationSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneClassName</key>
                <string>CPTemplateApplicationScene</string>
                <key>UISceneConfigurationName</key>
                <string>MyApp—Car</string>
                <key>UISceneDelegateClassName</key>
                <string>MyApp.CarPlaySceneDelegate</string>
            </dict>
        </array>
    </dict>
</dict>

|假如你正在构建导航 CarPlay app,你还能够为 CarPlay dashboard 供给一个 scene 装备。

在 CarPlay scene 装备中,咱们需求指定一个类称号,该类在你的 app 中充任 CarPlay scene 的 scene delegate。

然后,咱们需求完结在 scene 装备中指定的代理类,并做以下几步:

  • 完结 CPTemplateApplicationSceneDelegate 协议中的 didConnect 办法。当你的 app 在 CarPlay 屏幕上发动时,CarPlay framework 会调用此办法。
    • 首要,你或许需求保留办法参数中 CPInterfaceController 目标,由于稍后你将需求它。
    • 接着,这儿将一个 CPListTemplate 实例设置为 app 的 rootTemplate。
  • 完结 didDisConnect 办法,在该办法中开释刚刚保留的 CPInterfaceController 目标,

示例代码如下:

// CarPlay App Lifecycle
import CarPlay
class CarPlaySceneDelegate: UIResponder, CPTemplateApplicationSceneDelegate {
    var interfaceController: CPInterfaceController?
    func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene,
            didConnect interfaceController: CPInterfaceController) {
        self.interfaceController = interfaceController
        let listTemplate: CPListTemplate = ...
        interfaceController.setRootTemplate(listTemplate, animated: true)
    }
    func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene,
            didDisconnect interfaceController: CPInterfaceController) {
        self.interfaceController = nil
    }
}

CPListTemplate 是列表款式的 template。CPListItem 是组成 CPListTemplate 的一种根本单元。每个 CPListItem 都代表 CPListTemplate 中的一行,它们的联系就像 UITableViewCell 与 UITableView。

iOS CarPlay|使用 CarPlay 为你的 App 提速

以下是创立一个 CPListTemplate 的示例代码:

// CPListTemplate
import CarPlay
let item = CPListItem(text: "Rubber Soul", detailText: "The Beatles") 
let section = CPListSection(items: [item]) 
let listTemplate = CPListTemplate(title: "Albums", sections: [section]) 
self.interfaceController.pushTemplate(listTemplate, animated: true)

当用户点击一个 CPListItem 时,CPListItem 的特点 listItemHandler block 会被调用。listItemHandler block 接收两个参数,第一个是被点击的 listItem,第二个是 completion block。当一个 listItem 被点击时,你的 app 或许会执行一些使命,例如:

  • 假如是音频 CarPlay app,播映被点击的 listItem 对应的音频
  • 跳转到一个新的 template

当一个 listItem 被点击时,CarPlay 屏幕上将会显现一个加载指示器,指示用户你的 app 当时正在加载中。当你调用了 completion block 后,加载指示器就会消失。因而,不管你执行完结了哪种使命,你都有必要调用 completion block。

// CPListTemplate
import CarPlay
let item = CPListItem(text: "Rubber Soul", detailText: "The Beatles") 
item.listItemHandler = { item, completion, [weak self] in
    // Start playback, then...
    self?.interfaceController.pushTemplate(CPNowPlayingTemplate.shared, animated: true)
    completion()
}

Template

运用 CarPlay framework,你的 CarPlay app 便是依据 template(模板)来构建的。Template 是在 CarPlay App 出现 UI 的办法。你的 CarPlay app 担任供给数据,Template 担任代表你将 UI 绘制到汽车的显现屏上。

iOS CarPlay|使用 CarPlay 为你的 App 提速

主张你前往 iOS CarPlay|经过 CarPlay 让你的 App 发挥更大的效果 – Template 了解更多关于 Template 的介绍。

All App

CPListTemplate (improved)

CPListItem (improved)

在 iOS 14 中,listItem 支撑动态更新了,包括 CPListItem 和 CPListImageRowItem 等等。CPListItem 上许多以前 readonly 的特点现在 readwrite 了。这很有用,举些音频 CarPlay app 的例子:

  • 专辑封面图片需求从网络获取,能够先给 listItem 设置一个 placeholderImage,待网络图片加载结束后再从头设置给 listItem。CarPlay 将仅主动从头加载 CPListTemplate 中需求更新的 listItem。
// CPListTemplate
import CarPlay
let item = CPListItem(text: "Rubber Soul", detailText: "The Beatles") 
let section = CPListSection(items: [item]) 
let listTemplate = CPListTemplate(title: "Albums", sections: [section]) 
self.interfaceController.pushTemplate(listTemplate, animated: true)
// Later...
item.image = ...
  • Apple Podcasts(播客 app)运用动态更新来使进展指示器随着音频播映进展的更新而更新。

CPListImageRowItem (new)

CPListImageRowItem 是 iOS 14 中新增的 listItem,它是网格款式,支撑显现一个标题和一组图片。

iOS CarPlay|使用 CarPlay 为你的 App 提速

CPTabbarTemplate (new)

CPTabbarTemplate 是 iOS 14 中的新 template,它是一种容器模板,能够在 tab bar 风格的界面中显现几个其它的 template,让用户一望而知。CPTabbarTemplate 很合适作为 CarPlay interfaceController 的 rootTemplate。

iOS CarPlay|使用 CarPlay 为你的 App 提速

接下来让咱们经过一段示例代码,看看怎么创立一个 CPTabbarTemplate。

  • 首要,咱们创立了两个 template,分别是 CPListTemplate 和 CPGridTemplate 类型。在 iOS 14 中,每种 template 都继承了一些新特点,支撑你自定义 template 在 tab bar 中的显现款式,你能够设置 tabTitle、tabImage、tabSystemItem、showsTabBadge 等等。
  • 接着,咱们经过一个 template 数组来创立一个 CPTabbarTemplate,数组中的每个 template 都将成为 tab bar 上的一个 tab。
  • 稍后,咱们能够动态更新 CPTabbarTemplate,例如增加新的 tab、移除 tab、从头排列 tab 等等。还能够像该示例所示,显现或躲藏一个或多个 tab 的 badge。
// CPTabBarTemplate
import CarPlay
let item = CPListItem(text: "Rubber Soul", detailText: "The Beatles") 
let section = CPListSection(items: [item]) 
let favorites = CPListTemplate(title: "Albums", sections: [section])
favorites.tabSystemItem = .favorites
favorites.showsTabBadge = true
let albums: CPGridTemplate = ...
albums.tabTitle = "Albums"
albums.tabImage = ...
let tabBarTemplate = CPTabBarTemplate(templates: [favorites, albums])
self.interfaceController.setRootTemplate(tabBarTemplate, animated: false)
// Later...
favorites.showsTabBadge = false
tabBarTemplate.updateTemplates([favorites, albums])

音频 App

将 MPPlayableContent API 和 template 共存于你的 app 中

在 iOS 14 之前,假如你要开发音频 CarPlay app,那么你就会运用到 MediaPlayer framework 的 MPPlayableContent API。MPPlayableContent API 是一种依据元数据的 API。你担任描述你 app 的数据,比如专辑和歌曲,然后体系会代表你组装出一个树形 UI 界面。值得注意的是,假如你想在 iOS 13 及更早版别中让你的音频 app 支撑 CarPlay,你能够将 MPPlayableContent API 和 template 共存于你的 app 中。

  • 在 iOS 13 及更早版别中,体系将会经过 MPPlayableContent API 来发动你的 CarPlay app;
  • 在 iOS 14 及更新版别中,假如你供给了 template,体系将会用它来发动你的 CarPlay app。

iOS CarPlay|使用 CarPlay 为你的 App 提速

CPListTemplate (improved)

CPListItem (improved)

针对音频 CarPlay app,CPListItem 新增了一些特点,例如播映进展指示器 playbackProgress 和 Now Playing 的弹跳动画 isPlaying。

iOS CarPlay|使用 CarPlay 为你的 App 提速

CPListImageRowItem (new)

CPListImageRowItem 是 iOS 14 中新增的 listItem,它是网格款式。Apple Books(图书 app)就运用了这个 template 来展现用户最近播映的有声书,如下图所示。

iOS CarPlay|使用 CarPlay 为你的 App 提速

接下来让咱们经过一段示例代码,看看怎么创立一个 CPListImageRowItem 并增加到 CPListTemplate 中,它和 CPListItem 相同简略。

  • 首要,咱们经过一个标题和一组图片创立了一个 CPListImageRowItem。
  • CPListImageRowItem 也有 listItemHandler block 来呼应点击事情。当用户在 CPListImageRowItem 中点击标题时,listItemHandler block 将被调用。在 Apple Books 中,将翻开一个新的 CPListTemplate 来显现更多最近播映的有声书。你需求保证 completion block 被调用。
  • 在 CPListImageRowItem 中每张图片都是能够被独立点击的,listItemRowHandler block 便是用来呼应每张图片的点击事情。相同的,你要保证 completion block 被调用。在 Apple Books 中,点击图片将翻开对应的有声书进行播映。
// List Items for Audio Apps
import CarPlay
let gridImages: [UIImage] = ...
let imageRowItem = CPListImageRowItem(text: "Recent Audiobooks", images: gridImages) 
imageRowItem.listItemHandler = { item, completion in
    print("Selected image row header!")
    completion()
}
imageRowItem.listImageRowHandler = { item, index, completion in
    print("Selected artwork at index \(index)!")
    completion()
}
let section = CPListSection(items: [imageRowItem]) 
let listTemplate = CPListTemplate(title: "Listen Now", sections: [section]) 
self.interfaceController.pushTemplate(listTemplate, animated: true)

CPNowPlayingTemplate (new)

CPNowPlayingTemplate 是 iOS 14 中供音频 CarPlay app 运用的新 template,它是音频 CarPlay app 的基石。

运用过音频 CarPlay app 的用户必定十分了解 Now Playing 界面。借助 CPNowPlayingTemplate,你能够更好地控制其外观和功用。

iOS CarPlay|使用 CarPlay 为你的 App 提速

你的 app 能够挑选启用“待播清单”和“艺人”按钮。

iOS CarPlay|使用 CarPlay 为你的 App 提速

你的 app 也能够挑选自定义底部的播映操作按钮。能够运用体系图标(体系供给了许多常见播映操作的图标)或自定义图标。

iOS CarPlay|使用 CarPlay 为你的 App 提速

你需求记住 CPNowPlayingTemplate 的几个特性:

  • CPNowPlayingTemplate 运用了单例形式,你应该运用和装备这个单例。
  • 假如你启用了可选的“待播清单”和“艺人”按钮,那么你应该为这些按钮的操作增加至少一个观察者。
  • 你应该在你的 CarPlay app 发动时(即 CarPlay scene 衔接时)立即装备 CPNowPlayingTemplate。由于体系或许会代表你来显现 CPNowPlayingTemplate,甚至仅仅为了显现 CPNowPlayingTemplate 而发动了你的 app。
    • 例如,当用户点击 CarPlay 主界面上的 Now Playing 按钮时,体系会发动你的 CarPlay app,而且立刻显现 CPNowPlayingTemplate。
    • 又例如,当你的 app 变成了 Now Playing app,体系还会增加 Now Playing bar 按钮在你的 app 的 navigation bar 或 tab bar 上。假如用户点击了这个按钮,体系将会显现 CPNowPlayingTemplate。假如这时候其他 app 变成了 Now Playing app,体系会主动移除该 Now Playing bar 按钮。
  • 在 template stack 中,你只能 push 一个 CPListTemplate 到 CPNowPlayingTemplate 之上。假如你的 app 启用了“待播清单”按钮,在 CPNowPlayingTemplate 中 push 一个新的 CPListTemplate 来向用户展现接下来的播映行列便是一个不错的办法。

iOS CarPlay|使用 CarPlay 为你的 App 提速

在《CarPlay framework 初体会》章节中,咱们看到了 CarPlay app 生命周期的代码。在 didConnect 办法中便是装备 CPNowPlayingTemplate 单例的最佳时机。

在以下示例代码中,咱们给 CPNowPlayingTemplate 装备了一个播映速度按钮,当用户点击它时会调用 completion block。完结初始装备后,你的 app 就已经准备好让体系代表你来出现 CPNowPlayingTemplate 了,而且在这之后你也能随时更新 CPNowPlayingTemplate。

// Now Playing Template
import CarPlay
class CarPlaySceneDelegate: UIResponder, CPTemplateApplicationSceneDelegate {
    func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene,
            didConnect interfaceController: CPInterfaceController) {
        let nowPlayingTemplate = CPNowPlayingTemplate.shared
        let rateButton = CPNowPlayingPlaybackRateButton() { button in
            // Change the playback rate!
        }
        nowPlayingTemplate.updateNowPlayingButtons([rateButton])
    }
}

通讯 App

iOS CarPlay|使用 CarPlay 为你的 App 提速

在 iOS 14 中,你能够运用 Carplay framework 对你的通讯 Carplay app 进行晋级,以在汽车显现屏中供给更好的通讯体会。

在 iOS 14 之前,通讯 app 在 CarPlay 中是作为信息和语音 app 存在。这些 app 通常是依据 SiriKit 和 CallKit 完结功用的,通讯 app 也有必要持续运用 SiriKit 和 CallKit 来供给语音和电话功用。从 iOS 14 开端,它们也能够运用 CarPlay framework 来显现联系人、信息列表以及信息状况。

CPListTemplate (improved)

CPMessageListItem (new)

通讯 app 最常见的一个功用是显现音讯列表。在 iOS 14 中,Apple 引入了一个全新的 CPListItem 的子类,叫做 CPMessageListItem,用于构建音讯列表。

iOS CarPlay|使用 CarPlay 为你的 App 提速

当用户点击 CPMessageListItem 时不会调用 completion block,而是依据你在 CPMessageListItem 中指定的参数来主动激活 Siri。用户也将持续经过 Siri 编辑、阅览或回复信息。

iOS CarPlay|使用 CarPlay 为你的 App 提速

在 CPMessageListItem 的左边,你能够挑选显现未读标志、图钉(置顶)、星标(保藏)或其它图标。你能够依据你的 app 的功用来启用它们。

iOS CarPlay|使用 CarPlay 为你的 App 提速

在 CPMessageListItem 的右侧,你能够挑选显现静音标志、文本或许可选图标。和其他 item 相同,CPMessageListItem 也支撑动态更新,你只需更新它的特点便能轻松地改动一条信息的元素。

iOS CarPlay|使用 CarPlay 为你的 App 提速

CPContactTemplate (new)

通讯 app 的另一个重要功用是展现联系人信息。CPContactTemplate 是 iOS 14 中的新 template,它便是为了完结这个功用而生。

你能够运用 CPContactTemplate 来显现联系人头像、描述文本、一组操作按钮和导航栏按钮。该 template 最多支撑三行文本以及四个按钮,这些文本和图标都能够自定义。

iOS CarPlay|使用 CarPlay 为你的 App 提速

电车充电、泊车和快速点餐 App

在 iOS14 中,Apple 新增了三种支撑 CarPlay 的 app 类型:

  • 电车充电
  • 泊车
  • 快速点餐

iOS CarPlay|使用 CarPlay 为你的 App 提速

iOS CarPlay|使用 CarPlay 为你的 App 提速

这几种 app 有许多共同点,它们都与驾驭体会密切相关,能够协助驾驭员在地图上找到目的地。此外,这些 app 能够查询汽车充电桩可用性、预定充电、泊车或点餐。iOS 14 中推出了一组新的 template,能够让你的 app 在 CarPlay 中供给这些功用。

接下来咱们用一个快速点餐 CarPlay app 的示例来讲解怎么运用新的 template 来开发这几种 app。这个示例 app 在显现屏顶部有 4 个 tab,分别是邻近商铺的方位、购买记录、保藏列表和订单信息。这个 CarPlay app 是经过精简的,不显现具体的食物菜单、账户管理或其他设置,只供给最常用的功用且操作简略。

iOS CarPlay|使用 CarPlay 为你的 App 提速

CPPointOfInterestTemplate (new)

不管用户是在寻觅邻近的得来速餐厅、电动汽车充电站还是泊车场,app 的首要使命都是定位。

CPPointOfInterestTemplate 是 iOS 14 中的新 template,它结合了 MapKit framework 供给的交互式地图和信息面板,能够用来显现邻近的地址并支撑让用户挑选。你的 app 供给要在地图上显现的地址列表和可选图标。这个 template 还供给了平移和缩放功用,而且会在地图区域发生改变时告诉你。

iOS CarPlay|使用 CarPlay 为你的 App 提速

CPPointOfInterest(POI)是组成 CPPointOfInterestTemplate 的信息面板的根本单元。你需求经过一个 [CPPointOfInterest] 数组来创立一个 CPPointOfInterestTemplate 实例,且这个数组最多只能包括 12 个 POI 元素。其中,每一个 POI 元素都包括了一个标题、一个可选的副标题和一个将显现在具体信息面板上的信息文本。

iOS CarPlay|使用 CarPlay 为你的 App 提速

|请记住,在 CarPlay 中只向驾驭员展现最相关的信息。在 iPhone 上,你的 app 或许会显现所有或许的地址;但在 CarPlay 中,你应该有所约束,只显现最相关或最近的地址。假如有多个地址在地图上显现挨得十分近的话,CarPlay 会主动将它们分组。

CPPointOfInterestTemplate 支撑动态更新特点,就像其它 template 相同。

在该示例中,为了表示和区别某个地址是被选中的,咱们更新被选中地址的 pinImage 特点,运用了一个不同的颜色(这儿用了黄色,而其它未被选中的用红色)。

iOS CarPlay|使用 CarPlay 为你的 App 提速

当列表中的一个地址被选中时,你能够挑选显现一个具体信息面板,上面显现关于该地址的具体信息和最多两个按钮。这些按钮可用于各种使命。比如:

  • 能够切换到导航 CarPlay app 来导航到被选中地址。
  • 能够 push 到另一个 template 来展现被选中地址的具体信息。

iOS CarPlay|使用 CarPlay 为你的 App 提速

更新地址列表

用户能够在 CPPointOfInterestTemplate 的上平移和缩放地图,这两个操作都会导致可视地图区域发生改变,你的 app 应该运用与发生改变后的可视区域对应的新的地址列表来更新这个 template。

下面咱们来看看示例代码:

  • 首要,给 template 设置一个遵循 CPPointOfInterestTemplateDelegate 协议的代理目标,该代理目标会在每次地图区域改变时得到告诉。
  • 然后,完结 pointOfInterestTemplate(:didChangeMapRegion) 办法来监听地图区域发生改变。在办法完结中,咱们依据改变后的地图区域 region 来获取新的地址列表 locations,然后将其传递给 template。此时,CarPlay 将会运用新的 locations 更新你的地址列表和地图。
// CPPointOfInterestTemplateDelegate
func pointOfInterestTemplate(_ template: CPPointOfInterestTemplate, 
                             didChangeMapRegion region: MKCoordinateRegion) {
    self.locationManager.locations(for: region) { locations in
        template.setPointsOfInterest(locations, selectedIndex: 0)
    }
}

在以下示例代码中,咱们完结了获取地址列表的办法。

  • 首要,先构建一个 [CPPointOfInterest] 数组。
  • 然后,经过查询你自己的地址数据库或许利用 MapKti 来承认邻近的地址。
  • 接着,遍历查询到的地址信息数据列表,运用这些数据来创立 CPPointOfInterest 实例并增加到数组中。你能够缓存 CPPointOfInterest 实例以重用。
  • 最终,调用 handler 将 [CPPointOfInterest] 数组回调出去。
// CPPointOfInterest creation
func locations(for region: MKCoordinateRegion, 
               handler: ([CPPointOfInterest]) -> Void) {
    var tempateLocations: [CPPointOfInterest] = []
    for clientModel in self.executeQuery(for: region) {
        let templateModel : CPPointOfInterest = self.locations[clientModel.mapItem] ??
                CPPointOfInterest(location: clientModel.mapItem,
                                  title: clientModel.title,
                                  subtitle: clientModel.subtitle,
                                  informativeText: clientModel.informativeText,
                                  image: clientModel.mapImage)
        tempateLocations.append(templateModel)
    }
    handler(templateLocations)
}

更新地址列表便是这么简略,经过呼应地图区域的改变,实时展现最新的 POI 列表,就能让用户找到邻近的目的地。

支撑选中地址

当用户点击地址列表中的某个地址时,显现该地址的具体信息面板。咱们能够经过设置 CPPointOfInterest 的可选按钮特点,给具体信息面板中增加一个 Select 按钮,供用户挑选该地址。

iOS CarPlay|使用 CarPlay 为你的 App 提速

示例代码如下:

  • 首要,创立一个 CPPointOfInterestButton 实例,并赋值一个 completion block。completion block 在按钮被点击时调用。这儿咱们将被选中地址对应的 CPPointOfInterest 实例的 image 设置为被选中的款式,一起将 CPPointOfInterestTemplate 的 selectedIndex 设置为被选中地址的 index。CarPlay 将会在汽车显现屏上动态更新。
  • 然后,将按钮赋值给 CPPointOfInterest 实例的 primaryButton 特点,该按钮就会显现在具体信息面板上。
// Point of Interest Template location selection
let primaryButton = CPPointOfInterestButton(title: "Select") { button, [weak self] in
            let selectedIndex = ...
            if selectedIndex != NSNotFound {
                // Remove any existing selected state on previous location
                self?.selectedLocation.image = defaultMapImage
                // Change annotation for selected POI
                self?.selectedLocation = templateModel
                templateModel.image = selectedMapImage
                // Update the template with new values
                self?.pointOfInterestTemplate.selectedIndex = selectedIndex
            }
        }
let templateModel: CPPointOfInterest = ...
templateModel.primaryButton = primaryButton

CPInformationTemplate (new)

咱们刚刚完结了显现和更新可视地图区域相关的地址列表以及支撑选中地址的功用。现在,一旦用户挑选了一个地址,或许执行了一个使命,你或许需求显现摘要或以其他办法完结交互。

CPInformationTemplate 也是 iOS 14 中的新 template。CPInformationTemplate 将许多内容会集在一个页面中,它由一列或两列的标签列表和一组页脚按钮组成,用于显现文本和接收用户呼应。

在需求全屏交互的情况下,这个 template 能够满意很多需求:

  • 就拿咱们这个快速点餐 app 示例来说,它能够用作订单摘要,就如下图所示,或许能够用作订单承认页面。

iOS CarPlay|使用 CarPlay 为你的 App 提速

  • 对于电车充电 app,它可用于展现有关充电站的重要信息。

iOS CarPlay|使用 CarPlay 为你的 App 提速

构建 CarPlay App 的一些注意点

  • 你需求为你的 app 申请一个 CarPlay 权限。CarPlay app 有必要是单一类别的,你需求挑选你的 app 所支撑的类别。你所挑选的权限将决定你的 app 能够运用哪些 CarPlay template。
  • 假如你正在构建音频 CarPlay app,而且想要支撑 iOS 13 及更早版别,那么 MPPlayableContent API 和 template 将共存于你的 app 中。

iOS CarPlay|使用 CarPlay 为你的 App 提速

总结

本文对 CarPlay framework 在 iOS 14 中的更新内容做了简要的介绍。假如你的 app 类别是 CarPlay 所支撑的,那么就从 import CarPlay framework 开端,让你的 app 在 CarPlay 中大放光荣!

有关 CarPlay 的更多信息,能够查看 CarPlay for developers 上更新的《CarPlay App Programming Guide》。在这个网站上,你还能够为你的 app 申请 CarPlay 权限,以及查看每个权限具体能够运用哪些 CarPlay template。

假如你需求将你的音频 CarPlay app 部署到 iOS 13 或更早版别中,主张你再次阅览 MPPlayableContent API 阐明文档;假如你正在构建一个通讯 CarPlay app,你的 app 有必要运用 SiriKit,你能够在 CarPlay 开发网站上找到很多的阐明文档和资源;假如你正在构建一个依据 template 的导航 CarPlay app,请观看 WWDC18 – CarPlay 车载音频和导航 App。

相关链接

  • WWDC20|10635 – Accelerate your app with CarPlay
  • WWDC18|213 – CarPlay Audio and Navigation Apps
  • Apple Developer|CarPlay for developers
  • Apple Developer|CarPlay App Programming Guide
  • Apple Developer|MPPlayableContent API

推荐阅览

  • 师大小海腾的 GitHub|iOS- CarPlay
  • iOS CarPlay|与你分享 CarPlay 音频 App 的开发过程与细节
  • iOS CarPlay|WWDC22 – 经过 CarPlay 让你的 App 发挥更大的效果
  • iOS CarPlay|WWDC20 – 运用 CarPlay 为你的 App 提速

我正在参加技术社区创作者签约计划招募活动,点击链接报名投稿。