WWDC Quick Look 💓 By SwiftGGTeam
Rev up your CarPlay app

Rev up your CarPlay app

观看原视频

Highlight

iOS 27 为 CarPlay 引入视频应用、语音对话应用、导航面板和路线共享四大新能力,开发者可以用 CarPlay 框架在车机屏幕上直接构建视频浏览 UI、语音交互界面和更灵活的导航面板,同时让车辆辅助驾驶系统读取导航路线。

核心内容

视频应用:从 AirPlay 到原生浏览

以前,用户想在车里看视频,只能在 iPhone 上播放后通过 AirPlay 投到车机屏幕。操作路径长,而且无法在车机上直接浏览内容。

iOS 27 新增了 CarPlay 视频应用类别。只要车辆支持 video in car 功能,你的应用就可以在车机屏幕上直接展示视频列表、缩略图和详情页。用户停车时可以在车机上完成从浏览到播放的完整流程,比如充电等待时看视频。

视频应用需要两个条件:支持 AirPlay 视频串流,同时使用 CarPlay 框架提供浏览界面。如果车辆当前不允许视频播放,内容会自动降级为音频-only 继续播放,这对播客和体育直播很有用。

语音对话应用:从导航专属到全类别开放

语音对话应用在年初已经推出,但最初仅限特定类别。iOS 27 将其开放给所有 CarPlay 应用类别。

你的应用现在可以在车机上响应语音指令并执行操作。Voice Control 模板支持全屏和浮层两种展示方式。浮层模式特别适合导航应用,可以叠加在地图模板上方,用户边看地图边语音交互。

导航面板:从固定模板到自由组合

以前的 CarPlay 导航应用受限于固定的模板流程,展示路线选项和行程信息的灵活性不足。

iOS 27 的 Panel 让导航应用可以在地图主界面上自由组合多种 UI 元素,包括行程(trip)、网格(grid)、路线选择(route choice)、途经点(waypoint)和列表项。面板底部还可以配置操作按钮,比如”开始导航”或”结束”。地图始终可见,内容叠加在上方。

路线共享:让车辆辅助驾驶系统读懂你的导航

这是一个容易被忽略但影响深远的能力。很多带辅助驾驶系统的车辆需要知道你的行驶路线,才能做自动变道、调整引导系统,或者为电动车规划充电站。

以前 CarPlay 导航应用和车辆系统是割裂的。iOS 27 的路线共享(Route Sharing)让导航应用把路线以地理坐标数组的形式同步给车辆。车辆可以据此建议充电站等途经点,导航应用收到建议后可以选择自动提示用户确认,或者自己管理确认流程。

详细内容

视频浏览 UI 的新 API

02:16)CarPlay 框架为视频浏览提供了完整的 UI 组件。

列表现在支持纵向和横向两种比例的图片。Card 元素更进一步,支持缩略图叠加层(overlay)、播放进度和运动信息。

// 创建带叠加层的缩略图
let overlay = CPImageOverlay(image: badgeImage)
let thumbnail = CPImageSet(
    light: landmarkImage,
    dark: landmarkImage
)

// 配置播放元数据
let playbackConfig = CPPlaybackConfiguration(
    elapsedTime: 120,
    duration: 600,
    playbackAction: .play
)
playbackConfig.preferredPresentation = .video

// 组合到列表项
let item = CPListItem(
    text: "Alps",
    detailText: "Switzerland"
)
item.setImage(thumbnail)
item.imageOverlay = overlay
item.playbackConfiguration = playbackConfig

关键点:

  • CPImageOverlay 可以是文字或图片,用于标记”新上线”或”直播中”等状态
  • CPPlaybackConfigurationpreferredPresentation 决定内容优先以视频还是音频形式播放
  • playbackAction 控制点击后的行为:播放、暂停或重播
  • 播放状态变化时要及时更新 playbackConfiguration,缩略图上的进度条才会同步

05:29)Details Header 适合在列表顶部突出展示单个内容:

let header = CPDetailsHeader(
    title: "Eiffel Tower",
    subtitle: "Paris, France",
    body: "Completed in 1889...",
    image: thumbnail
)
header.playbackConfiguration = playbackConfig
header.actionButtons = [
    CPBarButton(type: .text, title: "Play", handler: { _ in }),
    CPBarButton(type: .text, title: "Add to Playlist", handler: { _ in })
]

let template = CPListTemplate(title: "Landmarks", sections: [
    CPListSection(items: relatedVideos, header: header)
])

关键点:

  • Details Header 把缩略图、标题、正文、播放配置和操作按钮组合在一起
  • 播放进度会自动与第一个操作按钮结合展示
  • 状态变化时更新 playbackConfiguration,确保用户返回时看到正确的进度

MiniPlayer 控制

06:22)iOS 27 为 Now Playing 模板新增了 MiniPlayer,所有使用 Now Playing 的应用自动获得这个能力。大屏设备上可以直接在 MiniPlayer 上播放、暂停和跳过。

如果你的应用不需要 MiniPlayer,可以关闭:

// 关闭 MiniPlayer,改用导航栏图标
CPNowPlayingTemplate.shared.allowsMiniPlayer = false

关键点:

  • 默认开启,无需额外代码
  • 关闭后,Now Playing 入口以导航栏图标形式出现

Voice Control 模板

07:08)Voice Control 模板现在对所有应用类别开放,支持全屏和浮层两种模式。

// 以浮层方式展示语音控制
let voiceTemplate = CPVoiceControlTemplate(
    title: "Ask about landmarks",
    subtitle: nil,
    image: nil,
    actionButtons: [
        CPBarButton(type: .text, title: "Navigate", handler: { _ in })
    ]
)
interfaceController.presentTemplate(voiceTemplate, animated: true)

// 作为 overlay 展示
interfaceController.presentTemplate(
    voiceTemplate,
    animated: true,
    presentationStyle: .overlay
)

关键点:

  • 浮层模式下文字要更简短,因为可用空间更小
  • 支持最多两个操作按钮,加上导航栏的 leading/trailing 按钮
  • 可以用 URL 打开方式触发导航或拨打电话:CPTemplateApplicationScene.shared.open(url)
  • 建议配置 AVAudioSession 使用 playAndRecord 类别,用音频反馈提示对话状态

导航 Panel

12:03)导航应用可以用 Panel 组合多种元素:

let panel = CPPanel(
    items: [
        trip,
        routeChoice,
        waypointList,
        gridItem
    ],
    buttonConfiguration: CPButtonConfiguration(
        primaryAction: .go,
        secondaryAction: .end
    )
)
mapTemplate.pushPanel(panel, animated: true)

关键点:

  • Panel 的 items 可以混合 CPTripCPRouteChoiceCPWaypointCPGridButton 等多种类型
  • buttonConfiguration 配置面板底部的操作按钮
  • 推送 Panel 后,导航应用控制地图模板的主界面区域
  • 地图始终可见,Panel 内容叠加在上方

路线共享

15:06)导航应用通过 Map Template 代理方法启用路线共享:

// 启用路线共享
func mapTemplateShouldProvideRouteSharing(_ mapTemplate: CPMapTemplate) -> Bool {
    return true
}

对单个行程禁用:

// 此行程不参与路线共享
trip.routeSegmentsAvailableForRegion = false

关键点:

  • 需要 iOS 26.4 以上和受支持的车辆
  • 用户首次配对车辆时需要授权路线共享
  • 路线以地理坐标数组(route segments)的形式发送给车辆
  • 车辆可以建议充电站等途经点,通过 CPMapTemplate 代理方法接收
  • 导航应用返回更新后的行程估计时间,地图模板会自动提示用户确认;也可以不返回估计时间,自己管理确认流程

核心启发

为充电等待场景做视频内容

做什么:电动车充电通常需要 20-40 分钟。如果你的应用有视频内容(教程、新闻、体育),做成 CarPlay 视频应用,用户在充电等待时可以直接在车机屏幕上浏览和播放。

为什么值得做:充电等待是车内使用屏幕的高频场景,但以前用户只能通过 AirPlay 投屏,操作路径长且无法在车机上直接浏览内容。原生 CarPlay 视频应用让浏览到播放的完整流程都在车机上完成。

怎么开始:申请 CarPlay video entitlement,使用 CPTabBarTemplate 添加视频标签页,确保应用同时支持 AirPlay 视频串流。

用语音对话替代复杂的列表操作

做什么:在驾驶场景下,让用户说出”播放我最喜欢的播客”比层层点击列表更安全。用 CPVoiceControlTemplate 把搜索或推荐功能做成语音交互。

为什么值得做:驾驶时分心操作屏幕有安全隐患。语音交互让用户视线不离开路面就能完成操作,浮层模式可以叠加在现有界面上,不会打断当前操作流。

怎么开始:使用 CPVoiceControlTemplate 创建语音控制界面,配置 AVAudioSession 使用 playAndRecord 类别,用音频反馈提示对话状态。

让导航应用与车辆辅助驾驶协作

做什么:开启路线共享后,带辅助驾驶系统的车辆可以基于你的路线做自动变道、充电规划。

为什么值得做:以前 CarPlay 导航应用和车辆系统是割裂的,车辆辅助驾驶不知道你的行驶路线。路线共享让导航应用把路线同步给车辆,车辆可以据此建议充电站等途经点,提升驾驶体验。

怎么开始:实现 mapTemplateShouldProvideRouteSharing 返回 true,把 CPTriprouteSegments 设置好,通过 CPMapTemplateDelegate 接收车辆建议的途经点。

用 Details Header 做内容推荐

做什么:视频或音频应用可以用 CPDetailsHeader 在列表顶部突出展示”今日推荐”或”继续观看”,下面列出相关内容。

为什么值得做:平铺列表缺乏层次感,用户需要滚动很久才能发现重点内容。Details Header 把缩略图、标题、正文、播放配置和操作按钮组合在一起,用户一眼看到重点。

怎么开始:创建 CPDetailsHeader 实例,设置标题、副标题、正文和图片,配置 playbackConfigurationactionButtons,将其作为 CPListSection 的 header。

用 Panel 做更丰富的导航界面

做什么:导航应用不再局限于固定的路线预览和选择流程,用 Panel 在地图上同时展示路线概览、途经点列表和快捷操作按钮。

为什么值得做:以前的 CarPlay 导航应用受限于固定模板,展示路线选项和行程信息的灵活性不足。Panel 让多种 UI 元素自由组合,地图始终可见,用户在一屏内看到更多信息。

怎么开始:创建 CPPanel,在 items 中混合 CPTripCPRouteChoiceCPWaypoint 等类型,用 buttonConfiguration 配置底部操作按钮,调用 mapTemplate.pushPanel 展示。

关联 Session

  • SwiftUI — 如果你的 CarPlay 应用同时有 iPhone 版本,可以用 SwiftUI 共享 UI 代码
  • Live Activities — CarPlay 支持所有应用的 Live Activities 和小组件,不需要专门做 CarPlay 适配
  • Design principles — 车机界面设计需要遵循特定的安全性和可读性原则
  • App Intents new — 语音对话应用可以结合 App Intents 让 Siri 理解更复杂的用户指令
  • Xcode 27 — CarPlay Simulator 已集成到 Device Hub,可以在 Xcode 27 中直接测试

评论

GitHub Issues · utterances