大多数浏览器和
Developer App 均支持流媒体播放。
-
开发 CarPlay 车载系统 - 第 2 部分
了解 CarPlay 车载如何与您的车载信息娱乐系统整合。了解 CarPlay 车载如何与您的车载资源协作,如显示屏、扬声器、麦克风、用户输入、方向盘控制键、仪表板和传感器等。
资源
相关视频
WWDC19
WWDC17
WWDC16
-
下载
你好 我的名字是Tanya 欢迎参加第二部分 关于开发CarPlay系统 第一部分的视频已经准备好了 所以如果你还没有看过它 你一定要去看看 在这一部分 我们会覆盖更多细节 在CarPlay是如何集成 到一个典型的汽车 信息娱乐系统里的
我们从一个系统的概览开始 然后谈论音量和资源管理 最后以讨论应用状态管理结尾
现在让我们进入系统概览
如果你观看了第一个视频 你会记得要实现一个CarPlay 接收器所需的软件组成部分 总之你需要和主机之间 有一个基于IP的连接 不管是USB或者Wi-Fi IP是为了交换数据 CarPlay通讯插件的一个实例 实现控制协议 音频框架用来播放和录制声音 视频框架用来渲染视频流
然而这些组件只是一个子系统 在一个典型的车载主机中 除了CarPlay的功能 主机还有自己的原生界面 音频资源和逻辑 两者一起构成完整的主机
然后你添加 车里所有的硬件资源 麦克风 音响 显示屏 传感器 用户输入设备 然后你就有了完整的系统
好的 这样我们就有了整个系统 现在的问题是 怎样让那些看起来互相竞争的子系统 互相协同工作?
让我们来理解这个问题 首先让我们来看看 传感器的数据是怎样被交换的 我们会用位置数据举例 位置信息包括GPS接收器获得的 数据 或者传感器数据比如轮胎速度 数据通过iAP2传输给设备 并且要一直可用 并且在手机需要时会被查询
接下来让我们来看看仪表组 也就是抬头显示 这个辅助显示 被用来显示设备提供的元数据 这些元数据可能包含 当前播放的音轨 正在进行的通话 或者从iOS 10开始 路线规划导航 数据还是通过IP协议发起 以及根据需要交换
现在让我们来看看 主显示发生了什么 当然要控制 在显示屏上显示的内容 用户必须 用一个触摸屏 一个应用控制器 或者两者都用 所以我们可以认为 显示器和用户输入设备都是存在的
当CarPlay UI活动时 设备在主显示屏上渲染视频流 屏幕和用户输入都被设备使用
但是如果原生用户界面显示在 屏幕上 那么显示屏和用户输入都 被转到原生子系统
然而方向盘上额外的用户控制器 比如语音识别按钮 下/上一个单轨 可能与CarPlay相连 即使屏幕上显示的是原生UI
这样总是可以打开Siri 或者播放下一个单轨
我们已经看过用户界面集成 让我们来谈谈音频
车载音频可以被粗分成3类 第1类提供对音响和麦克风的使用 这被用来通话和进行语音识别
然后我们有音频播放 对任何媒体内容 比如收音机 音乐
最后我们有警告类别 被用作导航提示 或者其他更高优先级的警告
在原生子系统中 这三种类别会被重新发现
在CarPlay中 我们有一个主音频通道 它包括通话 语音识别 和音频播放
还有另一个音频通道被保留 给高优先级提示和声音 比如导航提示或者新消息通知
那么媒体通道 可以播放来自手机的音乐 或者播放来自原生音频资源 的媒体
现在我们看过了媒体播放 我们来看看发生了什么 当CarPlay接到电话时
通话需要音频通道提供 麦克风和音响 所以媒体播放被中断 并且通道被切换了
音频被切换到一个通道 这个通道提供对麦克风和音响 的访问
除了切换到音频通道 屏幕被切换到CarPlay来显示 通话UI
仪表组上的元数据信息 也会更新
当然 如果原生系统也支持通话 那么通话会使用原生系统 来播放和显示 但是在原生系统中通话时 用户可以用Apple Maps导航
所以每当接近转弯时 Apple Maps会播放一个声音 通过公告通道来通知用户 通话继续被转到汽车的音响上 但是路线规划导航通知也被显示 它们和通话音混合在一起 当然在这种情况下 我们不希望用户 听到手机的导航提示 只是一个警告音提醒前方有转弯
如果用户希望看到 下一个转弯在哪 主显示可以显示Apple Maps
最后当通话结束后
音乐继续通过原生子系统播放 就像用户在通话前正在听的一样 现在导航公告 将包括所有的导航语音 因为用户不再进行通话
好的 如你所见 集成CarPlay是一个 很复杂的任务 特别是在共享硬件资源方面 但是在我们进行这些细节前 让我们看看音量控制
音量管理
你们可能知道 一个普通的车载主机显示 音量指示 当用户操作音量旋钮时 然后那个音量旋钮 控制当前播放的音频的音量
CarPlay音频也有相同原理 但是有一个不同的音量设置 对每一个主要的CarPlay应用 让我们看看它们
当播放Siri时 音量旋钮只对语音互动设置音量 当有来电时 来电铃声的音量被控制
当用户在通话中时 通话音量被控制
如果靠近下一个转弯 导航提示被播放 那么用户可以改变导航音量 请记住媒体可以在后台播放 但是它的音量会在有那些提示时 自动降低 而且不能被改变
一旦提示音结束并且音乐音量 恢复正常 这个旋钮就会控制媒体音量
好的现在让我们来看看资源管理
我们来看看哪些资源被管理 谈论他们怎样被管理 并讨论一些典型的例子
我们看到有很多硬件资源 但是让我们理解它们中的哪些 被管理了
只有2个 mainScreen是汽车的主显示 以及mainAudio 因为这个资源提供对车载音频 系统的访问
这些资源可以被占有或借用 当你占有一个资源时 它在无限的时间内属于你 它基本上就是你的 当你借用一个资源 你可以使用它一段时间 但是使用完后你要还回去
我们让原生用户界面 永久占有显示 用户可以使用原生导航 或者听收音机 或者修改一些汽车设置
怎样永久切换到原生UI? 原生UI可以在用户按硬件按钮时 占有屏幕 或者切换到原生UI 在CarPlay UI里的入口 或者用原生语音识别来启动 一个原生应用
现在假设用户选择 主菜单里的 Apple CarPlay图标
这种情况下 CarPlay接管屏幕 因为用户明确的要求这样
是什么导致的这个永久切换? 任何和CarPlay有关的硬件按钮 或者如我们所见 原生UI中的任何CarPlay按钮 或者通过Siri 例如通过说打开地图
现在有其他应用需要借用资源 请记住它们只需要使用一会 然后会还回来
我们在谈论哪些应用?
通话 话音互动 通知 警告
让我们来看一个例子 原生UI占用主屏幕资源 并且永久在屏幕上显示
现在用户在CarPlay里接到电话 CarPlay UI借用屏幕 并显示通话时间 一旦通话结束 我们回到原生UI 并保持这样直到有其他用户活动
接下来让我们看看主音频资源 主音频可以被分为四个主要类型 每个类型被不同 CarPlay应用使用 因为它提供 对不同硬件资源的访问
媒体仅有音频输出 被用来播放所有媒体 警告仅有输出 被用来播放铃声和定时器警告
Siri使用语音识别 因为它加入了对麦克风的使用
对用来通话的电话类型同样如此
对用作未定义音频的默认类型 也是如此
但是不要忘记第二个音频通道 它用作导航公告 alternateAudio没有被管理 它基本上总是可用 所以不需要占用或借用它 在mainAudio通道里 alternateAudio与所有的音频类型都 是混合在一起的 它总是可以被访问
就这些了 我要交给Tom来谈谈资源管理
谢谢Tanya 大家好 我是Tom 我也在CarPlay组里工作 我们已经知道了哪些资源被管理 而且你知道可以占有或借用资源 让我们谈谈怎样管理它们
要在两个子系统中分配资源 我们需要仲裁者 我们把这个仲裁者叫做 资源管理器
资源管理器是干什么的? 它主要有三个任务 首先它知道整个系统的当前状态 其次它根据 一些严格的规则来决定 哪个系统获得资源 第三根据当前状态和一系列规则 它把资源分配给一方或另一方 让我们看看实际中 它是如何工作的
假设原生UI和CarPlay 都需要在屏幕上显示一些信息
它们都发出申请要求获得 屏幕的所有权
那么资源管理器查看内部状态 并决定它们中的哪个应该获得屏幕
我们假设在这个情况下 原生UI的请求 有更高优先级 那么屏幕被分配给它 资源管理器发送通知 屏幕现在可以被原生UI使用
只有原生UI可以在屏幕上显示内容 必须要注意到状态并没有改变 直到资源管理器发送更新
那么资源管理器是在哪运行? 它是原生系统 还是CarPlay的一部分? 当我们设计CarPlay时 我们问了自己同样的问题 我们考虑了交换资源的详细信息 的复杂性 我们考虑了未来 如果那些规则要调整该怎么办? 如果CarPlay上出现新应用 该怎么办? 如果车上没有已有的设计需要 处理该怎么办? 哪种方案带来最大的灵活性 在接下来的五年? 所以我们决定实现一个系统 在原生系统中的复杂度更低 更易于升级 当消费者拥有车辆一段时间后 所以资源管理器在iOS里实现
因为资源管理器是 与原生系统互动的组件 我们让iPhone作为控制器 让主机作为附件 但不要忘了 所有iPhone应用请求同样的资源 用和原生UI同样的方式
接下来 你可以用什么命令和资源管理器 互动?
很简单 你只需要两个命令 changeModes命令 用来请求或释放资源 modesChanged命令 用来描述当前状态
changeModes 是主机发出的通知
在这个情况下主机是附件 向作为控制器的资源管理器
changeModes命令表明 附件想对资源做什么 它声明它为什么需要这个资源 以及谁可以占有或借用这个资源 当它被传递后
modesChanged 是控制器传递回主机的通知
modesChanged 提供当前状态 它描述谁拥有这个系统资源 它发送这些信息 所以附件知道一个资源是否被传递 所有者是否更换了
我们来谈谈资源管理器如何工作 的更多细节
我们从一个简单活动开始 切换iOS音频到收音机 然后我们会谈论原生语音识别 再接下来是怎样处理倒车雷达 这个情况下你不想iPhone应用 来打扰你 最后我们会看一个Siri触发 音乐播放的例子
让我们来看播放收音机音频 假设iPhone正在 通过车载音响播放音乐
然后用户在原生系统中想听收音机 这是收音机按钮
主机发送changeModes 请求获得音响的所有权 而且它获得这个所有权 因为用户可能会继续听很长时间 的收音机
控制器把音频交给主机 且发送modesChanged通知
主机就是音频资源的新的所有者
它可以开始播放收音机 mainAudio资源在这时被永久 赋予主机
总之这个例子向我们展示了 什么时候要求一个资源 以及原生系统不应该使用该资源 在它拥有这个资源前
让我们看下一个例子 使用原生语音识别
在我们的上个例子里 收音机仍然在播放
让我们看看用户启动原生语音识别 时会发生什么
这个单元请求暂时拥有显示和音频 所以transferType 应该设置成借用音频和屏幕
mainScreen和mainAudio 传递给附件
然后原生语音识别开始
一旦语音对话结束 主机把借用的资源交还 通过发送unborrow命令
因为单元在之前正在播放收音机 资源被重新赋予给主机
收音机可以继续
现在你可能想知道 为什么附件已经拥有资源 还要借用资源? 这是一个很好的问题 当资源管理器评估请求时 要变更一个资源的所有权 控制器要知道系统的当前状态 资源管理器需要知道你为什么在 使用这些资源 这样它才能进行正确判断 如果其它部分晚些时候需要资源
我们来看下一个例子 显示倒车雷达
若CarPlay正播放音频 屏幕上正显示原生UI 当用户挂倒车档 倒车雷达借用屏幕 然而请注意它也告诉资源管理器 屏幕不可被再次借用
资源管理器把屏幕分配给原生UI 并且注意到这个限制
现在显示倒车雷达 CarPlay音频继续播放 但是现在用户接到来电
iPhone不能在屏幕上 显示任何内容 因为主机限制了对屏幕的访问 但是铃声能过音响播放
这是怎么发生的?
changeModes命令中 这个单元告诉资源管理器 它拥有的资源使用哪些规则 通过在任何时间设置 borrowConstraint 这个单元允许应用借用资源 通过把它设置成user-initiated 只有用户发起的事件可以借用 永远没有应用可以使用这些资源 在这个例子中
如你所见这个限制对系统的行为 有个很大的影响 所以它们必须被正确使用 只有需要用户立即注意时 才限制访问 有CarPlay连接时 不要限制永久所有权
这就是使用倒车雷达
最后一个例子 当Siri播放音乐时发生了什么
我们又一次从播放收音机开始
用户启动Siri
Siri在手机上运行 资源管理器告诉原生系统 资源被分配给Siri
Siri出现然后用户说 “Siri播放音乐”
Siri交还显示和音频资源 但是现在音乐应用需要音频资源 播放音乐 所以资源管理器通知主机 手机拥有mainAudio 但是屏幕还给附件 主机不再继续播放收音机
所以在车里能听到iPhone音频
我们从中看到什么? 在两种场合 资源管理器 在没向主机发送请求的情况下 改变了状态 这是完全可以的 因为手机上的应用也会请求资源 如果它们得到资源 单元收到了通知 怎么处理这种情况 在每个modesChanged之后 你要检查你是否是所有者 如果你是继续你的活动 否则你需要得到CarPlay来处理 第二 不要忽略 手机发起的把资源切换给手机
至此我们已经看过了资源交换 的例子 但是还有一种情况两边 都想完成同样的任务 让我们看看应用是怎么被管理的
我们要管理原生和CarPlay应用 它们有相似的特点 但是关于那些应用呢? 他们导航 通话 语音识别
我们通过appState来实现 什么是appState? 我们用不同的appState记录 谁现在参与了 共享的应用 这些应用只能活动 在附件上或者控制器上 在任一个时刻 所以这三个不同的appState 是TurnByTurn PhoneCall和Speech
让我们来看看 导航appState是怎么被管理
当导航在附件上启动时 它用一changeModes命令 来更新要激活的 TurnByTurn appState
在这个例子中 是最后的会获胜的情况 控制器把TurnByTurn appState交附件 返回一个modesChanged 命令 显示附件 是当前运行的导航
现在让我们来看看用户用Apple Maps 设置一个新目的地时会发生什么 当原生系统已经在导航时 用户说 “Siri带我去最近 的咖啡店” 现在iPhone开始了导航 控制器更新TurnByTurn appState
这是对附件的指令 要停止它自己的导航
现在iPhone开始导航 控制器更新TurnByTurn appState 这是对附件的指令 要停止它自己的导航
现在Apple Maps的导航 显示在了屏幕上 并且公告通过音频播放 并且和原生导航系统不会冲突
所以现在Apple Maps的导航 显示在了屏幕上 并且公告通过音频播放 并且和原生导航系统不会冲突
关于导航就这么多了 接下来让我们看看通话
如果主机支持通过Bluetooth 来使用第二个电话 并且有一个正在进行的通话 这个通话独占mainAudio 通话不能被打断 那用户在CarPlay设备上收到 来电会发生什么?
CarPlay只能在这台设备上响铃 因为不能打断正在进行的通话 被PhoneCall appState管理
最后来看看语音互动 如果主机有原生的语音识别 当它运行时借用了资源 并独占音响 麦克风和屏幕资源 但是它能在任何时候被用户 发起的事件打断 所以用户启动Siri
原生语音识别结束 Siri继续出现在车载显示上 Speech appState 被用来实现这个
总之 CarPlay和你的原生系统依赖 相同的资源 被设计成和原生用户体验共存 为了优秀的CarPlay体验 考虑每一种使用情况的资源处理 遵守CarPlay设计建议 CarPlay的详述可以通过 MFi Program获得
若你还没有观看开发CarPlay 系统的第一部分 我鼓励你去看一下 关于这次讨论的更多信息 请访问屏幕上的网址
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。