大多数浏览器和
Developer App 均支持流媒体播放。
-
CarPlay 车载音频和导航 App
了解如何更新音频或导航 app 来支持 CarPlay 车载。CarPlay 车载中的 app 针对车用进行了优化,能够自动适应可用的汽车屏幕和输入控制。音频 app 能够输出音乐、新闻、播客等。通过新的 CarPlay 车载框架,导航 app 可以提供详细地图、目的地搜索、逐向导航和用户通知。
资源
相关视频
WWDC22
WWDC20
WWDC17
-
下载
(车载音频及导航app 音乐及转弯)
欢迎参加车载音频及导航app演讲 我是Jonathan 是iOS车载体验团队的一名工程师 今天我们非常高兴 跟大家分享一些更新 帮你们在CarPlay车载中 创建很棒的体验
我们从CarPlay车载 音频app讲起 然后我们要介绍 全新的CarPlay车载框架 可以在你导航app中应用 并且我们还要进行快速演示 给大家展示 在CarPlay车载系统中 创建很棒的导航体验有多简单 我们首先快速回顾一下 CarPlay车载系统
CarPlay车载系统是在汽车中 使用iPhone更智能安全的方式 你可以毫无压力地处理 一些比较常见的场景 通过汽车内置播放按钮 当你驾驶汽车时 你可以打电话、发送和接收信息 听音乐、播客和收音机 现在还可以通过导航app获取导航 这些都可以在路上驾车时完成
你可以把汽车屏幕 当作手机的第二个外显示屏 你的app可以在汽车屏幕上 呈现另一个版本 拥有面向汽车优化的用户界面和功能
还会有一些特别的设计考虑 当在CarPlay车载系统中 呈现时
CarPlay车载车辆 有多种输入样式 有些汽车有触控屏幕 有些汽车有旋钮 可以上下左右移动从而进行选择 还有一些汽车有触控板 支持滑动手势 你甚至可以 通过追踪手指轨迹输入字母
在靠右驾驶的汽车中 CarPlay车载状态栏 和app内容将会自动切换 从而使它更靠近驾驶员
有些汽车还会通知iOS 当转换成 一种较暗的界面模式时 通常这种情况发生在夜晚 或当汽车的车灯打开时
你的app可以此为信号 比如更新地图碎片的显示样式
CarPlay车载汽车 还支持多种屏幕尺寸 和纵横比 iOS会为你处理所有输入方式 因此你只需要针对CarPlay 车载系统写代码就好 请放心 所有配置都会支持它 你可以在CarPlay车载系统中 创建怎样的app呢? 这些是CarPlay车载app的 五个类别 车里是一个特殊的地方 如果你有一款app属于这五个分类 你需为app申请能在CarPlay 车载系统中使用的授权
如果你不确定app 是否归属于这些类别 并且你也参加了本次演讲 请在今天晚些时候 到我们的实验室中面谈 稍后我们再具体讲一下 你可以通过这个URL 给你的app申请授权
让我们快速了解一下 CarPlay车载app的分类
汽车生产商app是CarPlay 车载app的一个特殊类别 这些app是由汽车生产商创建的 并且只能在该生产商 所生产的汽车中使用 它们可以显示全部自定义用户界面 比如暖风和冷风 座椅控制 以及其它与汽车相关的直接集成 如果这些app集成了SiriKit 那么你就可以修改全部设置 只需要通过语音控件
去年我们向CarPlay车载系统 引入了信息和VoIP app 你的信息和VoIP app 可以接入SiriKit 因此 你的用户可以实施 许多常见的信息任务 当连接到CarPlay车载系统时 当在路上驾驶时 请查看SiriKit了解更多信息 或者可以查看去年的演讲 名字叫做为你的app 启用CarPlay车载
先前发布的iOS中 我们向CarPlay 车载系统引入了第三方音频app 音频app使用了针对汽车 进行了优化的模板界面 即你的app会针对汽车屏幕 提供数据和元数据 今天我们要跟大家分享一些 针对音频app所进行的 性能改善和优化
最后但同样重要的是 今天我们要介绍CarPlay框架 是针对CarPlay车载 导航app的一种全新的iOS框架
就像音频app一样 iOS在汽车屏幕中显示你的app 并通过汽车屏幕处理界面 你的app不需要担心 输入硬件或许多针对汽车的特别考虑 你只需要更新地图碎片体验 让它适合汽车显示屏即可
CarPlay车载框架 提供一种固定的用户界面模板集合 是iOS针对汽车显示屏进行渲染的 你的app会决定 如何创建并配置这些模板 以及需要采取何种操作 来响app户互动 通过app模板 稍后我们会详述 CarPlay车载系统
现在回头看CarPlay 车载app分类 今天我们主要讲 其中两个分类:音频和导航 让我们先讲一下 音频app Albert
谢谢Jonathan 今天跟大家分享CarPlay车载 音频app相关信息我感到非常激动 我们首先看一个概述 如何将音频设置为 适用于CarPlay车载系统 还有我们在iOS 12中 所做的性能改善和优化 以及一些最佳范例 还有一些常见场景 当把你的音频app 开发为CarPlay车载app时
现在驾车和音乐是息息相关的 很明显 当你驾驶车辆时 你总想听你最喜欢的打击乐 古典乐或甚至是一些播客片段 或收听收音机的最新新闻
我们想确保 如果你正在开发一款音频app 并且你希望给驾驶员提供最好的体验 现在为了说明这个问题 我想让你们 看一下我一直在做的一个小项目 它是一款小app 我觉得一定会很火
我的app叫做Srirocka
它主要结合了我最喜欢的两个功能: 最火的频道和最火的专辑 通过协同效应 当我们发布它以后 它一定会是App Store中 最受欢迎的音频app之一
现在Srirocka已是 功能完全的音频app了 但我们需要给它添加 CarPlay车载系统支持 那么让我来说明该如何做
就像Jonathan刚才提到的 CarPlay车载所使用的模板 会抽象剥离CarPlay车载中 所具备的一些不同的复杂性 比如输入方式和屏幕尺寸等等 因此你的音频app只需能在 CarPlay车载显示屏上 显示信息并提供最好的内容即可 这通常是通过表视图或标签来实现的 取决于你希望如何呈现你的数据
你需要关注的是向CarPlay 车载用户提交适当的内容 并且如果你已经在开发一款音频app 并且它使用的是现有的API 你可能已经非常熟悉了 那么让我们具体看一下
那么这是你要在 CarPlay车载系统中 发布app所需要了解的三个API 如果你想了解具体信息 可以参考去年的演讲 详细解释了每一个API 但我会大概介绍一下每一种API 要在CarPlay车载显示屏上 浏览内容 你需要使用 MPPlayableContent MPPlayableContent 有一个数据源和一个委托 因此你或你的音频app 可以填充app的信息 在CarPlay车载显示屏上 并且委托会接收回调 无论何时当用户在CarPlay 车载显示屏上做出选择时 现在如果你已将 立即播放元数据设置为 控制中心或锁定屏幕 或你正在现有的音频app中 开发此功能 那么你一定已经很熟悉这两个API
MPNowPlayingInfo 中心允许你 填充立即播放元数据及其它元素 比如标题和专辑名称等等 在CarPlay车载系统的 立即播放屏幕上 以及控制中心和锁定屏幕 如果你已经这么做了 MPRemoteCommandCenter 允许你的app响应远程命令事件 比如播放命令、下一曲等等
我们希望让CarPlay车载app 拥有流畅的立即播放体验 现在让我们看看 这些如何在代码中实现
当打开Srirocka后 我要把Srirocka当个例子 这是支持CarPlay车载 音频app所需要的最少操作 Srirocka会提供一个数据源 和一个委托 给MPPlayableContentManager 因此Srirocka可以提供信息 到CarPlay车载显示屏 并在绝对必要时做出响应
接下来我会设置NowPlayingInfoCenter 并让MPNowPlayingInfoCenter了解 我的app将提供立即播放元数据 当它成为立即播放app时
最后我会响应 MPRemoteCommandCenter事件 特别注意的是在本例中只需 一个播放命令 当Srirocka 成为立即播放app时 它会响应这些事件
我们可以在此看到CarPlay 车载系统所需要的那个API 就是MPPlayableContent 对于iOS 12 我们针对如何 更好优化这个API进行了深刻审视 我们可以安全地说在iOS 12中 我们重新灌录了MPPlayableContent (重新灌录 MPPLAYABLECONTENT) 我们深度分析了MPPlayableContent 并且我们改善了它的性能 在如何调取数据源 和如何调用委托方面 你不需要修改当前音频app 在CarPlay车载系统中的实施 我们加速了启动过程 并提供更流畅的动画 无论何时当CarPlay 车载显示屏上的内容发生变更时 我们还向你的app提供更好的通讯 以预估用户可能希望播放什么内容 或在CarPlay车载显示屏上 想要浏览什么内容
现在你有更大的空间 来改善你的音频app 让我们看看该如何实现 首先要查看 reloadData的实施 这是MPPlayableContent中的 一个调用 它会了解如何为你的音频app 进行更好优化 我们发现你其实 应该只调用reloadData 当绝对必要时 它的功能是拆解 整个app的层级 在CarPlay车载显示器上 并请求你的音频app 再次进行重新构建 这可能是一个非常昂贵的操作 让你app的响应性变得不那么强
相反 如果你只需要更新一些内容 你应该把它们一起打包到一个 beginUpdates和一个endUpdates中 从而可以适当地更新内容
现在MPPlayableContent 所拥有的调用 是异步操作 当我们向你的app请求数据时 因此 需要在你app的某个位置 保存内部陈述或信息缓存 那么当我们请求你的内容信息时 你就能迅速给我们提供信息 并使你的app保持响应
接下来让我们讨论一些办法 关于进一步优化音频app 在CarPlay车载系统中的性能
Srirocka已经有一些实施了 并且是部分实施 用户需要决定 在Heating Habaneros 播放列表中做出选择 它是现在超级火 和最受欢迎的播放列表之一 但它的加载看起来似乎不顺畅 我们并不能完全确信 这里正在发生什么 CarPlay车载系统实际会超时 如果app不及时提供内容的话 因为它不会调用完成处理器 或就只是不会返回信息 手机上到底发生了什么?
CarPlay 车载系统用户通常会在 不能快速连接的区域 或屏幕锁定情况下驾驶汽车 绝大多数CarPlay车载用户 都会在屏幕锁定 且需解锁密码的情况下驾车 毕竟他们是在开车
如果你的app的数据保护政策 依赖于手机处于解锁状态 你将不能获取你app的信息 并且最终CarPlay车载 将会超时 因此如果你的数据 需要在手机处于解锁状态时获取 你就需要审查 你的app的数据过渡政策
另一个问题是…
你或CarPlay车载用户 可能会在 很少或没有蜂窝网络活动的区域驾驶 驾驶员们会开车去任何地方 从乡村公路到农村地区 再到大城市 这些是非常多变的区域 有不同的CarPlay车载系统 不同的数据服务 并且你需要测试 没有恒定WIFI网络连接的情况
现在Srirocka 也考虑到了这个情况 但它使用了一些非常先进的机器学习 来了解哪个是最火的频道 毕竟这一切都发生在移动设备上 因为隐私是非常重要的问题 这只需要一点时间去处理 嗯 在本例中发生了什么?
我们在indexPath有一个API 叫做beginLoadingChildItems 用于发起获取内容 这个API会被调用 无论何时当你的任意一个索引路径 在CarPlay车载显示屏上可用 当用户在表单元格间滚动 或选择不同标签时 会调用beginLoadingChildItems 针对每一个 显示在显示屏上的独立索引路径
这样你的app就有机会开始加载 在用户实际选择内容之前 这是Srirocka中的 一段代码示例 当用户在CarPlay车载显示屏上 看到Heating Habaneros播放列表时 我们就开始处理 那个播放列表的代码示例 当用户做出选择时 所选内容正在路上 通过网络请求 或立即提供内容
那么让我们看一些app场景 可能会在你开发 CarPlay车载app时遇到
当你注销时 Srirocka 提供丰富的用户体验 这里非常清楚 有漂亮的排版 很棒的图形设计 用户是注销状态还是需要登录 但这在CarPlay车载显示屏上 看起来是什么样的呢?
Srirocka实际上在注销时 不提供任何数据 这会导致一种非常坏的用户体验 用户实际上不知道发生了什么 也不能和你的app进行交互
你应该确保你提供某种类型的体验 从而用户起码可以 跟你的app进行交互 即使当用户注销时 营造了一种很好的音频app用户体验
那么总结一下 CarPlay车载音频app 拥有自己最棒的特色 MPPlayableContent 可以允许app 提供CarPlay车载显示屏模板 从而你的app 可以在CarPlay车载 显示器上提供很棒的用户体验 你该关注一些现实世界的场景 比如当你的app被注销时 或你的屏幕锁定时 你的app在CarPlay 车载系统中仍展示完美的功能性
在iOS 12中 我们做了一些很棒的优化 和性能改善 让你的app 在CarPlay中变得更好 你需要再次运行你的app 并了解是否还有性能改善的空间 从而让你的app变得越来越好
现在为了确保我们不跑题 我想邀请同事Mike上台 谈谈CarPlay 车载框架中的导航 谢谢
好的 谢谢Albert 今天我很高兴跟大家分享 如何向你的导航app中 添加CarPlay车载系统支持 导航是CarPlay车载系统 体验中的一大部分 你的用户会非常乐意 在汽车显示屏中看到他们喜欢的app
正如Jonathan 和Albert之前提到过的 我们针对之前的app类别 采取了以模板为基础的方法
你的app要能提供数据和元数据 这样iOS会显示在汽车显示屏上 并且以你app的名义管理这些交互 这用起来非常棒 但我们意识到导航app有一些不同 你的app有漂亮的地图 还有如此美好和身临其境的导航体验 并且你的用户会期待 在汽车屏幕上也看到同样的效果
在iOS 12中 我们引入了 CarPlay车载框架 CarPlay车载框架是你用来 创建良好交互体验的工具 在汽车显示屏上 它使用了你的app可以创建并使用的 固定模板对象集合 iOS将会把它转化为用户界面 并呈现在你app的顶部 通过这个以及你需要付出的 一点点努力 你的app就会支持 所有的CarPlay车载系统 让我们看看CarPlay 车载系统中的一款app 我们一直在创建自己的导航app 叫做Country Roads 它通过路线 把我们带到最喜爱的目的地 让我们看看它在 CarPlay车载系统上为何样
现在我们位于CarPlay车载主屏幕上 你可以看到Country Roads图标 就在这里 还有iOS上的其它app 当我们打开它时 你所面临的第一个元素 就是我们漂亮的地图碎片 当我们连接到 CarPlay车载系统时 导航app会打开一个窗口 用于在汽车显示屏上绘制内容 这个窗口就是你的画布 用于显示所有漂亮的非交互式地图 和导航相关内容 因为app使用了模板 iOS会把这些模板 转化为一个能在app顶部 呈现的用户界面
让我们看看代码 当你的app连接到 CarPlay车载系统时发生什么
你需要注意的第一件事 就是app的委托 要遵守CarPlay车载 app委托协议 CP app委托
那个协议中的一个函数是 在窗口中app didConnectCar InterfaceController
这个函数会给你的app 提供两个非常重要的对象 第一个是 CPInterfaceController实例
CPInterfaceController 是你和模板世界的连接以及你的app 将用什么来管理 汽车显示屏上显示什么内容 此外 你将会获得 我刚提到的那个窗口 就是你可以绘制全部地图内容的地方
你必须保持对全部两个对象的引用 在CarPlay车载会话的 整个过程中
接下来你要创建一个新的视图控制器 向那个窗口中填充内容 并将它分配到你的窗口浏览控制器 然后创建一个根模板 通过那个界面控制器对象 你可以在汽车显示屏上 setRootTemplate
让我们谈谈 在CarPlay车载框架中 可用的模板 让我们从一个你们已经看到 并且用户会花费大部分时间 的一个模板开始 那就是地图模板
地图模板与其它模板不同 因为它在app窗口中是透明的 那么你在那个窗口中所绘制的内容 将在由地图模板 所提供内容的底层显示
地图模板可以在几个 不同的地方进行配置 你可以在导航栏中放置一个按钮 你最多可以放置四个: 两个在导航栏 两个在路径栏 这些是CPBarButton实例 可以是文本或图像 并且系统会自动调整其尺寸和样式 并没有任何预定义按钮行动的概念 在CarPlay车载框架中 但当你创建按钮时 你需要提供一个自定义行动处理器 当用户与汽车显示屏上的按钮交互时 将会在你的app中 调用你的自定义行动处理器
你还可以在地图窗口上方 放置最多四个按钮 这些是地图按钮 你可以通过图像创建 跟杆状按钮不同 这些按钮的样式并不是由系统定义的
地图模板还是 许多其它地图 和导航相关功能的集合体 比如拖动地图 通过导航警告向你的用户 提供重要的情境信息 当然 还有路线指引 我们稍微谈谈路线指引 让我们从拖动地图和导航警告开始谈 如果你的app支持拖动地图 我们要求你在地图模板上 呈现一个按钮 无论在导航栏 或作为地图按钮都可以 只要能进入拖动模式就可以 当地图模板进入拖动模式时 它会显示四个方向按钮 你的用户可以与之交互 并会被转换到一个API中 你的app只需要了解 向哪个方向拖动地图 这个示例 展示CarPlay 车载框架如何抽象剥离 不同的CarPlay车载系统 所具备的大部分复杂性 这些按钮可以通过触摸进行交互 高延迟或低延迟触摸屏都可以 通过一个旋钮或触控板 选择其中一个按钮 此外在CarPlay车载系统中 如果旋钮也支持控制杆或定向移动 同样的移动也会 被转化到这个API中 你的app不需要担心它来自哪里
当你的用户在驾车时 你可能想要给他们呈现一些信息 比如前方道路关闭 或也许是有一条更好的路径选择 为此你可以使用导航警告 导航警告呈现在地图模板上 可以配置一个标题、副标题、图像 主行动和第二行动 如果适用的话 你还可以使用遣散区间 然后警告就会自动遣散
让我们看一下如何创建根模板的代码 让我们添加一个新按钮 在Country Roads上 它是迷路功能
因为这是创建我们根模板的函数 我们要做的第一件事就是创建 CPMapTemplate的实例
然后我们要针对迷路功能 创建一个新按钮
Country Roads 一个很棒的功能是我们的用户 可以搜索他们最喜欢的类别 我们也为此添加一个新按钮 让我们创建CPBarButton 类型是图像 在它的自定义行动处理器中 我们会调用一个我们自己的函数 会显示我们自己喜爱的类别 然后我们会取回一个图像 并把它分配给按钮 我们希望这个按钮出现在路径空间中 在交通按钮的旁边 我们把这两个按钮 分配到地图模板上的 路径导航栏按钮 然后返回我们的地图模板
很棒 现在我们在地图模板上 有了一个按钮 我们想要一种 可以向用户显示 他们喜爱的类别的方式 为此CarPlay车载框架 有一个很棒的模板 即网格模板 网格模板会在一个网格格式中 显示一个不超过八个按钮的数组
这些按钮出现在这里 并且可以配置一个图像和一个标题
网格模板还有一个导航栏 你可以放置同样的导航和路径按钮 但你还可创建一个网格模板 它的标题会出现在导航栏中
让我们跳过代码并创建一个网格模板
我们要从给网格按钮取回图像开始 我们要添加一个停车场按钮
然后我们要创建一个 CPGridButton实例 标题是停车场 图像是我们刚取回的图像
那么和其它按钮一样 我们把它分配给一个数组 然后创建一个 CPGridTemplate实例 标题是收藏夹 因为这些是我们喜欢的类别 还有我们在代码中创建的 网格按钮的数组 我们要从这里 返回到那个界面控制器对象 我刚才提到过 这就是我们如何在汽车显示屏上 管理所呈现的内容 我们会使用那个界面控制器 把这个新网格模板 放到汽车显示屏上去
现在我们有一种方法 可以搜索我们喜欢的类别 以及我们喜欢的内容 我们需要一种方式 来向用户显示搜索结果 为此我们可以使用一个列表模板
列表模板将显示 一个CPList项的列表 它们可以是文本、详细文本、图像 和披露指示器 你可以提供多个节段 你还可以有一个导航栏 你可以在那里提供一个标题 以及同样的导航和路径按钮 CarPlay车载框架的 一个很棒的功能是 如果适用 它会在侧面显示一个很棒的滚动条 可以帮助你的用户 在驾车时翻页浏览搜索结果
让我们创建一个列表模板
我们要做的第一件事 就是把我们自己的搜索结果的数组 转化到一个 CPListItems数组中 我们可以通过 在我们的搜索结果类中 使用一些属性完成
然后我们初始化一个新的 CPListTemplate 将这些项作为一个节段 分配一个停车场的标题 也可以分配一个委托 来管理用户的交互 我们要使用界面控制器 把我们的新模板放到汽车显示屏上
当用户在屏幕上 与其中一个项进行交互时
listTemplate didSelect项 完成处理器 将会在你的列表模板委托上被调用
在CarPlay车载框架中 还有一些其他项可用 我想要快速地提一下
第一个是关于CarPlay 车载系统可以如何复杂 以及CarPlay车载框架如何 帮你不要太过担心的一个例子
我们现在看的是搜索模板 它是CarPlay车载框架中 的模板 呈现一个触控屏键盘 但我们了解到 并不是所有CarPlay车载系统 都有一个触控屏 很多都只有一个旋钮或触控板 用于用户交互 在那些系统中 如果适用 CarPlay车载框架 会显示一个线性样式的键盘 当然 对于那些 不支持字母识别的触控板来说 通过同样的搜索模板API 你的app将免费接收所键入的文字
你可能还想向用户呈现信息 以一种需要引起用户更多专注的方式 为此你可在ActionSheetStyle中 呈现CPAlert 或呈现真正需要用户注意的信息 你可以使用全屏模板
最后 因为语音是app中的一大部分 我们提供了一个能帮助你 管理语音控件的模板 我想邀请Jonathan返回舞台 给大家演示 Country Roads app Jonathan
谢谢Mike 让我们快速看一下 Country Roads
这是一个CarPlay车载模拟器 它包含Xcode 让我们从CarPlay 车载主屏幕开始 我们可以看到我们为CarPlay 车载系统启用的自定义导航app 让我们轻触图标打开app
当我们的app打开后 我们是从地图模板开始 app展示了 Mike刚提到 的内容 它是全透明的 并且它允许app的漂亮地图 进行尺寸调整从而完整显示 这幅地图太出色了
在这幅地图上 我有一些基础控件 比如用ECP地图按钮进行缩放
我还可以用这个拖动按钮 切换拖动模式
全部这些按钮都是简单的 可配置的模板对象 CarPlay车载系统会告诉app 当用户与某个按钮发生交互时 并且app可以进行缩放或采取 其它适当的行动来进行响应
Mike刚添加了 一个新的收藏夹按钮 它显示在路径一侧的导航栏上 当轻触它时 我们的app就会创建 配置并发布一个网格模板 可以让我们导航到 某个非常重要的目的地 如果我们选择停车场 app就会 创建、配置并发布一个列表模板 我们可以看到周围停车场的搜索结果 稍后再谈Country Roads 现在让我们请Mike回到舞台
好的 谢谢Jonathan
让我们谈谈 你的app向正在驾车的用户 提供的最重要的功能之一 那当然是路线指引 让我们根据用户在开始导航会话时 可能会看到的典型流程来了解一下
他们所需要的第一个要素就是目的地 这可能是由你的app 通过导航警告所呈现的地点 或者也许他们通过搜索 所发现的想要去的目的地
他们可能想预览路线 并查看相关重要信息 比如开车到那儿需要多长时间 以及预计到达时间 如果他们有多重路线可以选择 他们很可能想要预览每一种路线 并选择最适合他们的路线
他们选择其中一条路线 并开始导航 然后你的app就向用户提供路线更新
最终他们到达目的地或取消导航
让我们看看如何完成同样的流程 通过使用CarPlay车载框架
让我们先谈谈路线预览 你的app要提供数据 以用户可以查看 他们即将进行的旅程的 全部重要细节的方式 你可以提供目的地名称 与路线有关的信息 比如建议性通知 还可以提供预计时间 让他们了解他们何时会到达目的地 并且如果旅程有多重路线选择 CarPlay车载框架 会自动显示一个更多路线按钮 那会允许你的用户 在不同的路线之间切换 并选择他们所需要的路线
让我们看看在CarPlay 车载框架路线预览中 创建体验所需要了解的类和方法
第一个是CPTrip 这是给用户显示即将进行的旅程 它包括一些项 比如起点和目的地 以及多个CPRouteChoice 每一条 他们可能选择的路线都有一个CPRouteChoice
CPTravelEstimates 描述了整个旅程需要多长时间 以及个人操作
在你的地图模板上 当你准备给用户显示路径预览时 你需要在地图模板上调用 ShowTripPreviews 它要带有你所创建的 CPTrip对象
因为用户要在单一路线之间切换 那么你就有机会更新 在窗口中所显示的内容了 将会调用使用routeChoice的 MapTemplate selectedPreviewFor 并且你可以修改所显示的内容
这是一个了解地图模板 如何绘制 在窗口中所显示的内容的好机会
你要确保你所绘制的内容 对你的用户可见 为此我们需要利用现有的 safeArea API 你可能已经很熟悉它了 随着地图模板中的内容变更 它会更新 你窗口中的safeArea插入 从而让你了解哪里可以进行安全绘制 你只需要实施 safeAreaInsetsDidChange 并紧密关注那些插入 并确保你的内容 是在它们内部进行绘制的
现在让我们谈谈路线指引
与预览相似 你的app可以向 CarPlay车载框架提供数据 并让它绘制路线指引卡片 卡片内填充有信息 比如代表移动方向的图片 你离目的地还有多远 当然了 还有如何到达目的地的指示 比如左拐或继续直行
让我们看看你需要了解哪些信息 从而在CarPlay车载框架中 使用路线指引
CPMapTemplateDelegate 和mapTemplate 你可以从这两个地方开始 首先 当用户从路线预览中 点击那个开始按钮时 会在模板委托中调用使用了 routeChoice的mapTemplate startedTrip 这是你要开始导航到目的地的指示 通过用户所选择的路线
这也是何时开始在app中 进行导航的时间 亦开始向CarPlay车载框架 提供路线更新的时间 你需要调用 startNavigationSession 在你的地图模板上 这将给你提供 CPNavigationSession实例 这就是你要管理 即将发生的移动方向的地方
使用CPNavigationSession 和CPManeuver 你可以设置即将发生的移动方向 并且系统会自动显示一个主方向 如果你提供了第二个移动方向 它会把第二个移动方向 显示在路线指引卡上
然后你就可以 使用移动方向的更新预估 来持续更新 在路线指引卡中所显示的内容 并让你的用户了解 当他们接近所指示的移动方向时 你的app很可能会重放音频提示 从而让用户了解信息 为此你需要确保你的音频会话 已针对CarPlay车载系统 做了适当的配置 我们必须要记住 当我们在车里时 你的用户可能正在收听 来自iOS系统的音频源 或者他们可能正在收听 来自汽车系统的音频源 比如FM收音机 要用 AVAudioSessionModeVoicePrompt 配置你的音频会话 因为这会让CarPlay车载系统 了解何时可以适当地躲避音频源 无论它来自哪里 你还可以用类别选项配置 你的会话 duckOthers 和interruptSpokenAudio AndMixWithOthers 这将帮助确保你的音频 和其它iOS音频源能同时播放
那么接下来会发生什么? 嗯 你的用户会继续驾驶 你想继续提供 更新的移动方向和预估方向 从而当他们需要时 帮助他们转弯
若他们突然离开现有路线会如何? 你可能要计算一条新路线 你可设置一个暂停原因 它会向用户显示一个 重新安排路径的状态
也许会有一条新路线 或现有路线上有事情发生 那么你可以利用导航警告 向他们呈现那个信息 就在地图模板上
最终他们会到达目的地 这多亏了你的app帮忙 我们谈了很多东西 关于你的app 在汽车显示屏上 处于打开状态时的样子 但我们知道CarPlay车载用户 经常在地图app和音频app之间切换 比如我们最喜欢的 音频app Srirocka
当app在后台时发生什么? 当你需要向用户 显示重要信息时会发生什么? 你可以提供横幅通知 当你的app在后台时会显示 这适用于移动方向更新以及导航警告
在你的地图模板委托中 有三个方法可以实施 第一个是mapTemplate ShouldShowNotificationFor移动方向 当你设置了新的移动方向 并且你的app处于后台时 系统就会调用这个方法 如果你返回真 系统会把那个移动方向转化成 一个横幅通知
如果你已经针对某个移动方向 呈现了横幅通知 你只需要简单更新旅行预估 带travelEstimates的mapTemplate shouldUpdateNotificationFor 移动方向 将会被调用 从而允许你更新 在那个横幅中所显示的内容 那么 现在不需要一个新的通知 你可以简单地更新 已经显示在那里的内容 对于导航警告 你也可以利用它来显示那些信息 使用mapTemplate shouldShowNotificationFor navigationAlert 我想邀请Jonathan 再次上台来给大家演示 我们如何把 Country Roads app 与CarPlay车载框架集成 从而实现路线预览和路线指引 Jonathan
谢谢Mike 让我们快速了解一些代码 关于你的导航app如何 在CarPlay车载中提供导航 以Country Roads为例
当用户选择某个目的地后 我们会抓取那个地标并把当前位置 和目的地提交给我们的导航引擎 用于计算可选择的路线
为了达到演示目的 我们这里只有一条可选路线 但你的导航引擎可以提供 多个可供选择的路线选项 如果适用 此外 我们要包含一些额外的细节 来帮助用户做出知情决策 针对某一路线 我们要创建一个CPTrip并调用 showTripPreviews来告诉CarPlay 车载系统我们即将开始导航 最后我们要更新预估 从而向用户提供此次旅程的预计时间 让我们快速了解一下要如何提供 CarPlay车载系统导航 所需要的移动方向
当我们的用户已经选择了一条路线 并开始导航后 我们首先要隐藏 用户刚才所浏览的路线预览
我们要告诉地图模板开始导航会话 并且我们可以把会话改为加载状态 当我们计算移动方向时 我们要从导航引擎中 创建一个CP移动方向对象的列表 最后但同样重要的是 我们会向导航会话提供第一个指示 我们现已准备好驾车出发了 在行动中查看一下具体情况
好的 让我们浏览一下 收藏夹列表并选择停车场
当我们轻触其中一个地点时 我们会看到app 弹回到地图模板 并显示一个路线指引卡 如果我们轻触这里的开始按钮 选择开始导航 我们会看到app进入导航模式 你的app还可以更新导航栏 如果有必要显示自定义按钮 在导航模式 比如取消按钮或语音提示切换 看起来我们做得非常棒
当我们到达目的地后 我们的app就不再是导航模式
这就是CarPlay车载框架中的 地图 让我们回顾一下今天所讲的内容 我们演示了一些关于CarPlay 车载音频性能较大的改善 和优化 为了让你的用户 拥有更好的体验 我们引入了全新CarPlay框架 用于导航和指路app 在CarPlay车载系统中 你的app可以顺畅地 在不同屏幕和输入设备中使用 你是最棒的导航专家 并且你只需要做你最擅长的事: 在你漂亮的app中绘制漂亮的地图 我们会替你处理其余的事 你可以绘制你的地图模板 使用CPMapTemplate 和CPNavigationSession 来管理导航 并按照需要显示其它模板 用于呈现信息和处理用户交互
如果你有任何疑问 请到CarPlay车载工作室面谈 今天稍晚些时候 大概是上午11点到下午2点 你还可以浏览 developer.apple.com/carplay 获取更多信息 此外 你已经拥有了创建很棒的 CarPlay车载app所需的一切 我们非常期待看到你们所创建的app 非常感谢
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。