为你的 CarPlay 车载 App 加足马力
Rev up your CarPlay app
2026年6月10日
一句话判断
这场 Session 最值得关注的一件事是:CarPlay 终于把触角伸向了“停车场景”,通过新增 Video App 类别和全局 Voice Control 模板,Apple 正在把 CarPlay 从单纯的“驾驶辅助工具”变成“座舱娱乐与交互中枢”。
这场 Session 讲了什么
以前 CarPlay 的逻辑很死板:车在动,App 才能用;车一停,除了听歌啥也干不了。现在 iOS 27 彻底放开了这个限制。只要你的车机硬件支持,你可以申请 CarPlay Video entitlement,让用户在停车充电或等人时,直接在车机大屏上刷视频。配合新增的 CPNowPlayingTemplate MiniPlayer,音视频体验终于和 iOS 原生看齐了。
交互层面也迎来了大换血。以前只有特定类别的 App 能用语音对话模板,现在 CPVoiceControlTemplate 向所有 App 开放,还能以 Overlay(覆盖层)形式悬浮在地图等界面之上。对于导航开发者,新增的 Route Sharing(路线共享)能让你的第三方导航和车机原生系统的路由数据打通。这套组合拳打下来,受影响最大的是泛娱乐 App 和导航 App 开发者,普通工具类 App 也能借机蹭一波语音交互的红利。
值得深挖的点
停车看视频 (CarPlay Video Apps) 的战略意图与隔离设计
Apple 允许在 CarPlay 上看视频,绝对是对抗 Android Automotive 和各家造车新势力“彩电”生态的防守反击。以前车厂喜欢吹自己的车机生态,现在 Apple 直接把 iPhone 的视频能力投射过来。
设计上 Apple 做了严格的物理隔离:必须申请单独的 CarPlay Video entitlement,且系统会通过 CPSessionConfiguration 严格校验当前车辆是否支持视频、当前是否处于驻车状态。行车时视频会自动降级为纯音频模式。
这里的坑在于 entitlement 的互斥与共存。如果你的 App 既有音频又有视频,你需要同时申请 Audio 和 Video entitlement。如果你只申请了 Video,那在不支持视频的老款 CarPlay 车型上,你的 App 连图标都不会显示在 CarPlay 桌面上。这是个典型的“为了安全妥协体验”的 trade-off,开发者必须在 Info.plist 和 Provisioning Profile 里仔细配置,并根据 CPSessionConfiguration 动态渲染 UI。
全局语音控制 (Voice Control) 与 Overlay 形态的降维打击
把 CPVoiceControlTemplate 开放给所有 App,说明 Apple 意识到 Siri 在车内的体验依然不够垂直,需要 App 自己接管语音对话。
最妙的设计是支持 Overlay 展示。以前弹出语音控制会直接 push 一个新页面,打断用户当前的操作。现在可以通过 CPInterfaceController 以 Overlay 形式悬浮在 CPMapTemplate 上。这意味着你可以一边看着导航路线,一边用语音问 App “附近有没有充电桩”。
Overlay 的 UI 空间非常有限。Apple 明确要求在 Overlay 模式下使用更短的文本变体。如果你直接复用全屏模板的长文案,UI 会被截断得惨不忍睹。另外,语音状态反馈必须配合 AVAudioSession 的 playAndRecord 类别,并禁用 mixing,否则你的提示音会被车机当前的音乐直接盖掉。
代码片段
1. 动态控制 MiniPlayer
场景:默认情况下,所有展示 Now Playing 的 App 都会自动在底部显示 MiniPlayer。如果你有自己的全局导航栏设计,不想被系统 UI 遮挡,可以手动关掉它。
// 禁用系统默认的 MiniPlayer
// 关闭后,播放图标会退化到导航栏的右侧按钮
CPNowPlayingTemplate.shared.allowsMiniPlayer = false
坑:关掉 MiniPlayer 后,用户切换页面时就没有全局的“一键暂停/播放”浮窗了,必须确保你的 App 内部有足够显眼的播放控制入口,否则会被用户骂反人类。
2. 开启与降级路线共享 (Route Sharing)
场景:导航 App 接入车机原生路由系统,让车辆仪表盘或 HUD 也能显示你的第三方导航路线。
// 实现 CPMapTemplateDelegate 方法,全局开启路线共享
func mapTemplateShouldProvideRouteSharing(_ mapTemplate: CPMapTemplate) -> Bool {
return true
}
// 在构建具体 Trip 时,针对某次行程关闭路线共享
// 比如这是一条保密路线,或者车机不支持该路线类型的渲染
trip.routeSegmentsAvailableForRegion = false
坑:routeSegmentsAvailableForRegion 是实例级别的覆盖。如果你全局开了,但某条路线包含未映射的越野路段,一定要记得把这段 trip 的共享关掉,不然车机 HUD 上会显示一条断头路。
最佳实践
- 已有音视频项目:立刻去 Developer Portal 申请 CarPlay Video entitlement。在代码里通过
CPSessionConfiguration判断supportsVideo,动态在CPTabBarTemplate里加一个“视频”Tab。别硬编码,不然老车主看到点不动的视频 Tab 会提一堆一星差评。 - 导航项目:全面接入 Route Sharing。现在的车机仪表盘越来越智能,把路线数据喂给车厂,能大幅提升你的 App 在车企预装白名单里的权重。
- UI 适配:CarPlay 的列表现在支持横竖图比例和复杂的 Overlay。把
CPListItem的image和detailText利用起来,特别是CPPlaybackConfiguration,一定要在播放状态改变时实时更新,别让用户看到进度条卡死。
还有什么值得关注
- CarPlay Simulator 史诗级增强:现在可以直接在 Mac 上模拟不同车型的硬件配置(比如是否带视频支持),不用再苦等真车测试了。
- Detail Header (详细头部):列表顶部新增了一个大卡片 UI,适合放“正在播放的播客”或“电影简介”,下面再跟推荐列表,视觉层级终于合理了。
- 体育比分 Overlay:列表缩略图现在原生支持叠加左右球队 Logo 和实时比分,做体育类 App 的开发者可以直接白嫖这套 UI 了。