CarPlay 新增加油和驾驶任务应用,以及仪表盘导航支持
Get more mileage out of your app with CarPlay
2022年6月6日
一句话判断
CarPlay 今年开了两个新的应用类型入口(Fueling 和 Driving Task),同时推出了 CarPlay Simulator 这个开发利器——你终于不用跑到车里去调试了。
这场 Session 讲了什么
CarPlay 的设计哲学一直是「为驾驶者服务」。你的 app 在 CarPlay 上应该只提供驾驶时真正需要的功能,登录、配置、阅读条款这些事留给 iPhone。
今年 Apple 新增了两种 CarPlay app 类型。第一种是 Fueling(加油)应用,从 iOS 14 的 EV Charging 扩展而来,现在传统燃油车和替代燃料车辆也能用了。但 Apple 强调,加油 app 不只是找加油站那么简单——你应该让用户在 CarPlay 上直接操作加油泵。
第二种是 Driving Task(驾驶任务)应用,这是为极简 app 设计的类型。Apple 给了很多具体例子:道路状况信息 app、拖车控制器 app、里程记录 app、快速车道收费 app。这些 app 的共同特点是:一两个按钮就够了,用户 2-3 秒内就能完成操作。Session 里反复强调「厨房水槽不要」,只放驾驶时必须的功能。
另外还有一个重大更新:导航 app 现在可以在汽车的仪表盘(instrument cluster)上显示地图和转向卡片。实现方式和 iOS 13 的 Dashboard 支持一模一样,已经适配 Dashboard 的开发者迁移成本很低。
最后是 CarPlay Simulator——一个独立的 Mac 应用,连接 iPhone 后就能模拟 CarPlay 环境。你可以在办公桌上调试 CarPlay UI,同时用 Xcode 和 Instruments。
值得深挖的点
CarPlay Simulator 解决了一个真实痛点。 之前测试 CarPlay 只有两条路:用 Xcode Simulator(功能有限),或者把 iPhone 插到真车/售后 head unit 上(效率极低)。CarPlay Simulator 让你的 iPhone 通过 USB 连 Mac 就能跑完整 CarPlay 环境,同时还能用 Xcode debug、用 Instruments 看 performance。对于导航 app 来说,你可以在 Simulator 里测试语音指引和车载原生音频的混音行为,这在之前几乎无法在开发环境下验证。
Instrument Cluster 的 safe area 机制。 仪表盘视图可能会被车辆仪表盘的其他 UI 元素遮挡,Apple 用了 iOS 已有的 safe area 机制来处理。你需要 override viewSafeAreaInsetsDidChange 并用 safeAreaLayoutGuide 来确保关键内容(比如蓝色导航路线)不被遮挡。这是 Apple 把已有 iOS 概念优雅地映射到新场景的好例子。
代码片段
声明 instrument cluster 支持:
// Info.plist 声明支持仪表盘导航场景
// 添加 CPTemplateApplicationInstrumentClusterSceneSessionRole
// 和对应的 Scene Configuration
// 实现仪表盘 delegate
class NavigationSceneDelegate: UIResponder, CPTemplateApplicationInstrumentClusterSceneDelegate {
func instrumentClusterController(_ controller: CPInstrumentClusterController,
didEnterSidebarVisibilityState state: CPInstrumentClusterVisibilityState) {
// 根据可见性状态更新 UI
// .minimal 时只显示转向卡片,.detailed 时显示地图
}
}
Driving Task app 的极简设计:
// 一个只有两个按钮的里程记录 app
let personalButton = CPGridButton(titleVariants: ["个人"], image: personalIcon) { _ in
MileTracker.log(category: .personal)
}
let businessButton = CPGridButton(titleVariants: ["商务"], image: businessIcon) { _ in
MileTracker.log(category: .business)
}
let gridTemplate = CPGridTemplate(title: "里程记录", gridButtons: [personalButton, businessButton])
// 这就是整个 CarPlay UI,没有其他页面
CarPlay Simulator 切换显示配置:
// 在 CarPlay Simulator 的 General tab 可以切换显示尺寸
// 导航 app 必须测试不同尺寸和宽高比
// 推荐测试的尺寸包括:
// - 800x480 (标准)
// - 960x540 (宽屏)
// - 各种非标准宽高比
最佳实践
- Fueling app 不要只做位置查找,让用户能直接操作加油泵才是正确的产品形态。
- Driving Task app 尽量做成单屏 app,用户 2-3 秒内完成操作。
- 导航 app 用 CarPlay Simulator 测试不同 display size,确保 map drawing code 在各种宽高比下都正确。
- Instrument cluster 的关键内容要放在 safe area 内,用
safeAreaLayoutGuide约束。 - 用 CarPlay Simulator 的 limit UI 按钮测试车辆行驶时的内容限制行为。
还有什么值得关注
- CarPlay Simulator 在「Additional Tools for Xcode」安装包里,需要从 Apple Developer 网站下载。
- Instrument cluster 支持 zoom 手势,通过
CPInstrumentClusterControllerDelegate回调。 - 模板系统自动处理触摸屏和旋钮控制器的适配,你不需要写特殊的输入处理代码。