大多数浏览器和
Developer App 均支持流媒体播放。
-
让您的 App 支持 CarPlay 车载
了解如何让您的音频、信息、VoIP 通话或汽车制造商 app 支持 CarPlay 车载。音频、信息和 VoIP 通话 app 采用一致的设计,并且为在车内使用进行过优化。汽车制造商 app 提供车辆相关的控制和显示功能,让驾驶员无需离开 CarPlay 车载就能保持互联。探索最佳做法,并了解适用于 CarPlay 车载 app 的工具和框架。
资源
相关视频
WWDC18
WWDC17
WWDC16
-
下载
大家好 欢迎来到 让你的 app 适用于 CarPlay 这个讲座 我的名字是 Albert 我是 CarPlay 团队中的一名工程师
今天 我们将简要介绍 app 在 CarPlay 中是怎样运行的 怎样将你的 app 与 CarPlay 平台相结合 在开发中比较规范的做法 以及常见的错误
我们来看一下 app 在 CarPlay 中是 怎样运作的 当 CarPlay 运行的时候 CarPlay 的屏幕上 会显示 一些信息 如果一个 app 给出了关于“正在播放”的元数据 以及音频播放控制 这些信息也会在 CarPlay 的主屏幕 “正在播放”的 app 中显示 音频会通过车上的 扩音器系统播放 CarPlay 支持一些 SiriKit 框架中的意图
如果用户触发了一个 CarPlay 不支持的 SiriKit 中的意图 Siri 会告诉用户 这个功能 在车中不支持 即使你的 app 不支持 CarPlay 用户也可以处在 CarPlay 系统中时 在开始驾驶前 使用你的 app 为了保证一个良好的 用户体验 除非收到请求 否则确保你的 app 不播放音频 因为你的 app 播放的音频 可能会与用户当前 想要所播放的内容交叠 在一些情况下 你的 app 可能会与其他音频 进行适当的互动 对于一些例如有声书籍这种 播放音频的 app 使用这个协议 让你的声频在其他声频 播放的时候暂停 对于不时发出指示的 导航的 app 使用这两个协议 第二个协议将会在开始你的音频对话之前 暂停标为 “spoken audio” 的音频 的播放 因为你的导航音频将会 与其他音频混合播放 将你的音频对话标为“可以混合” 以便与其他音频 互动 那些与 CarPlay 结合程度高的那些 app 会显示在 CarPlay 的 主页面 在 CarPlay 中 运行的 app 会在 CarPlay 和 iPhone 的屏幕上显示 对于没有结合 CarPlay 的 app 00:02:17.466 --> 00:02:19.326 A:middle 只有 iPhone 屏幕上
会显示这个 app CarPlay 屏幕上 只显示主页面 有一些种类的 app 可以支持 与 CarPlay 的高度结合 这些包括音频 app 短信 语音通话以及汽车生产商的 app 音频 app 可以播放音乐 新闻 播客以及其他音频内容 并且要遵循一定的设计理念 即适合在车中使用
采用 Siri 的短信和语音通话 app 可以经过升级 适用于 CarPlay
汽车生产商的 app 可以有特定的汽车控制及显示的功能 00:02:53.496 --> 00:02:54.646 A:middle 让驾驶者使用这些功能时
不必离开 CarPlay 的环境
如果你认为你的短信 语音通话 或汽车生产商的 app 有可能支持 CarPlay 请在 CarPlay 开发者页面 告诉我们 在那里你可以为你的 app 申请权限 以便与 CarPlay 结合 不要忘记一些内容和图像 需要为 CarPlay 特制 图像要 2-3 倍大 因为根据不同车的 屏幕规格 CarPlay 的屏幕有 不同的大小 和分辨率
关于图标和 CarPlay app 设计的更多信息 请参照 iOS Human Interface Guidelines 以及 CarPlay Human Interface Guidelines
你可以用 Xcode 中的 iOS 模拟器 测试 CarPlay 的 app 但是为达到最好的 真实的测试效果 最好连接真正的设备 在车中测试
对于播放音频的 app 模拟器在播放状态下 有一些局限 不能反映 真正的用户体验
为了用 LLDB 全面调试你的 app Xcode 现在支持无线调试 在调试你的 app 的过程中 iPhone 可以连接在车上 或是车配件上 更多信息 请参照这一周 WWDC 中 “Xcode 9 调试程序” 这一讲座 如果你的 app 对用户数据使用数据保护 不要忘记 CarPlay 可能是在 iPhone 被密码锁住的 状态下运行 如果你的 app 有密码保护的数据 对文件 钥匙串
或 SQL 数据库使用了以下的类别 你的数据可能 在 CarPlay 中无法使用 你的 app 可能会有 异常的表现 让我们仔细的看一下 怎样让你的 app 与 CarPlay 相结合 我们重点举出了三类 支持 CarPlay 集成 音频 app 短讯和语音通话 以及汽车生产商的 app 让我们从音频 app 开始
在 CarPlay 中 音频 app 的用户界面 根据平台而优化 为用户提供一个 很容易使用的操作系统 便于获得他们想得到的内容 音频 app 的开发者 提供数据来源 和导航操作的框架 以便 CarPlay 的平台 在屏幕上显示 另外 “正在播放” 的信息 会显示给用户 相关的元数据 以及一些可以调节的操作选项 以便用户操纵播放速度 播放曲目 和其他的一些 音频 app 可能支持的 选项
app 在获得 CarPlay 的权限之后 CarPlay 必须至少实现 MP 可播放的 API 包括数据来源 和委托 这样 CarPlay 才能 获取内容 和开始播放
音频的 app 必须响应 MPRemoteCommandCenter 事件 让用户对你的内容发送指令 例如播放 暂停 或跳过曲目 最后 音频 app 必须 设定和更新 MPNowPlayingInfoCenter 字典 这其中包括 正在播放曲目的元数据 例如 艺术家名称 和时长 让我们看一下 音频 app 的 数据结构 CarPlay 会使用 NSIndexPath 根据特定的路径 来找寻内容 这与 UITableView 中 NSIndexPath 的使用 有所不同 让我们来看一个例子 这个例子中最左边的内容 是根数据项 在用户界面中 可以用单个的窗口 或者是根子表的形式来体现 这里是在整个数据结构中 每个内容的 路径 当 CarPlay 根据某个路径目录 要求某个内容的时候 音频的 app 会 遍历整个结构 来查找所需的内容 在这个例子里 我们要求第一个内容下面的第一个元素 也就是 “Running” 这个播放列表 CarPlay 还会询问某一个目录下面 包含的子元素的 数量 在这个例子里 我们询问 第二个内容下的 第三级中的 子元素数量 在这个例子中 数量是 2
一些车型可能会根据车辆 是否在行驶状态 而限制屏幕上 可显示的内容 这可能会限制屏幕上 可显示的的行数 以及点击进某一个目录后 可显示的内容 你的 app 可以利用 MPPlayableContentManager 来处理这些变化 查询所显示的内容是否会受到限制 使用 DelegateCallbackContentManagerDidUpdate 来查询内容 是否会受限 用这种方法 你的 app 可以 查询环境属性 就可以知道 表格视图中 允许多少项内容 以及你的 app 最多可以 显示几层菜单 如果你的 app 更适合页面 而不是表格视图 你可以通过将 UIBrowsableContentSupportSectionBrowsing 加到的你属性列表中 来增加页面 我们推荐最多使用 4 个页面 并使用短的标题 因为视窗的空间有限 并且有些汽车的屏幕比较窄 而且在播放内容的同时 还需显示 “正在播放”的 按钮
页面的图像会在 CarPlay 的屏幕上 做为模版图像显示 让我们看一下 CarPlay 中 “正在播放” 的屏幕 一些控制选项和元数据 与控制中心中显示的 是一样的 总的来说 你在控制中心中所看到的选项与数据 在 CarPlay 的 “正在播放” 屏幕中 也应该有所显示
要调出这个“正在播放”的屏幕 用户可以点击你 app 视图右上角的 “正在播放” 或通过点击 CarPlay 主页面上的 “正在播放” app 图标
运行过程中 你的 app 的名字会显示在 “正在播放” 的屏幕 的右上方
“正在播放” 屏幕的元数据 与设置控制中心等 相同 在 MPNowPlayingInfoCenter 中 设置一个信息字典 提供尽可能多的 信息 另外 对播放指令做出回应 这样用户可以对内容做出调整 例如播放 暂停 跳过曲目 随机播放或重复播放 歌单
这些是 CarPlay “正在播放” 的界面 支持的指令 在新的 iSO 11 中 “正在播放” 的界面支持显示 和调整播放速度 在 CarPlay 里 要想在你的 app 中“正在播放” 的界面里 显示播放的速度 需要将 MPNowPlayingInfo PropertyDefaultPlaybackRate 加到 MP Now Playing Info Center 里 并且利用 MPRemoteCommandCenter 里 存有所支持的一系列的播放速度的数组 来对调整播放速度的指令 做出反应 这里有一个代码的例子 展示了怎样实现 调整播放速度 在这个例子中 默认的当前曲目的播放速度为 x1 支持的 播放速度有 0.5 1.0 1.5 和 2.0 若用户想要调整播放速度 当播放速度不断增加 当增加至 所支持的最快播放速度时 播放速度 会循环到 最小值 在这个例子里 播放速度会增加到 1.5 然后到 2.0 然后回到 0.5
一些音频 app 会响应 MP 遥控指令中心中的 多项指令 根据指令的不同 运行中的 CarPlay “正在播放”界面 将会结合响应的指令 转化为一个按钮 例如省略号 或一个菜单按钮来替代 之前的按钮 规范的做法 在调用 MP playable content data source 和 MP playable content 委托中的 完成指针之前 将要播放的内容 准备好 对于那些不用页面 只用表格视图的 app 根表格必须返回 至少一项内容 CarPlay 会显示一个 读取任务进行情况的指示 如果 app 在一定时限内 没有返回内容 就会超时 如果你的 app 需要一些初始的设置 比如登入的信息 在页面的第一行 应该提示用户 app 当前的状态
关于使用音频的 app 就是这些内容 下面 Chris Whitney 将会讨论 CarPlay 中 有关短息 和语音通话的 app
大家好 我是 Chris Whitney 来自 CarPlay 工程师团队 Albert 谈到了关于使用音频的 app 下面我会讲解一些其他类别的 可以与 CarPlay 相结合的 app 我要讲解的第一类 是短信 以及用网络协议传输语音的打电话的 app
在 CarPlay 中 Siri 为 短信以及语音通话 app 提供接口 在主页面上 当 app 的图标被选中后 Siri 提供读信息 建立新信息 或开始语音通话 这几种选择
使用了 SiriKit 的 app 已经可以支持这些互动 但对 Siri 发出的 请求中必须包含 app 的名字
经过一些改动 短信和语音通话的 app 在 CarPlay 中 可以包含一个主页面的图标 提示 以及一个专门的 Siri 接口 这里是 CarPlay 中 支持短信和语音通信的 app 所要满足的要求
app 必须使用 SiriKit 中的短讯意图 并有专门针对 CarPlay 短讯的 授权
同样的 语音通话 app 必须使用 SiriKit 中的通话意图 并有专门针对 CarPlay 语音通讯的 授权
语音通话 app 还必须使用 CallKit 来通知 CarPlay 通话的 状态 一个 app 在 CarPlay 中 可以同时支持短信 和语音通话
让我们看一下更多 关于 SiriKit 技术要求的细节 对于短信 app Siri 通过 INSendMessageIntent 发送信息
Siri 通过 INSearchforMessagesIntent 读取新收到的信息 并搜寻未读信息 读信息的过程完成后 Siri 通过调用 INSendMessageAttributeIntent 将信息标记为已读
这三个意图在 CarPlay 中 是支持一个完整的信息读取过程 所必须用到的 对于语音通话 app Siri 通过调用 INStartAudiCallIntent 来开始通话 关于搜索 例如搜索未接来电 则通过调用 INSearchCallHistoryIntent
这些意图是在 CarPlay 中 完成一个通话流程 所必备的 关于 SirKit 的细节 请参见“SiriKit 最新更新” 以及“创造最好的 SiriKit 体验” 任何已经使用了 CallKit 的 app 都有一个 CarPlay 的接口 用来处理新来电以及 正在通话中的来电
但如果你的语音通话 app 还没有使用 CallKit 这样是结合 CarPlay 所必须的一个要求 总体来说 app 必须 在接到来电时通知 CallKit 来处理开始 接听和挂断的行为
如果该 app 的语音通话平台支持其他行为 例如无声 群组 来电等待和键盘声音 那么这些活动也应该 在 app 中实现
关于 CallKit 的更多信息 请观看 2016 WWDC “用 CallKit 提高语音通话 app” 的视频
app 可以在 CarPlay 中 显示新信息 和未接来电的提示 在 CarPlay 中显示提示 需要一些 其他的设置 在请求提示通知授权的时候 CarPlay 必须 包含在其中 并且信息必须单独在一个提示的类别中 通过 CarPlay 选项中 允许这个选项 来实现
提示这个类别 仅限使用于信息 不应该 用于其他 app 提示信息 提示这个类别必须指定一个 SiriKit 的意图 来处理 CarPlay 中的 对提示的选择 只满足 CarPlay 的短信 或语音通话的 app 才会被允许 请求发出 显示通知的授权
同时 用户可以使用设置选项 来禁止你的 app 在 CarPlay 中显示提示通知
让我们看一下 CarPlay 中 设置通知的 代码
首先 在请求发送提示通知的授权时 将 CarPlay 选项 包含进去
如果用户不接受提示通知 则让你的 app 恰当地禁止 与发送提示 有关的功能
接下来 建立一个新的信息类别 仅包含关于 信息的通知 关于其他功能的通知 例如新闻或游戏 不应该被包含在 这个通知类别中 给这个类别加一个标记 确保所有本地 或远程的 信息通知提醒 都有同样的类别标记 建立一个意图的标记 以便通知选项在 CarPlay 中被选中时 来设置 Siri 的互动
通常使用的是 INSearchForMessagesIntentIdentifier 这个意图 设置 Siri 让它搜寻这个意图 并读取与这个提示通知 对应的信息 关于开发短信和语音通话 app 有一些推荐的 对应的信息 在通知的标题或副标题中 应该只包含发送者 和群组名称 等信息 信息的内容不应该 在 CarPlay 中显示出来 读取一条信息过后 Siri 将使用 INSentMessageAttributeIntent 将信息标为已读
读取状态 应该显示在 app 中 在之后搜索信息的活动中 也应该体现 用户可能驶入或者驶出信号覆盖的范围 所以 app 应该使用提示 来通知用户 未接来电 或者发送失败的信息
像我们之前描述的那样 这可能需要 单独设置另一个 提示类别 可以结合 CarPlay 的 最后一个类别的 app 是汽车生产商的 app
只有这类汽车生产商的 app 可以在 CarPlay 中 显示自定义 用户界面 在这个例子中 汽车生产商的 app 提供温度设置 选择收音机频道 以及呼叫公路援助的功能
在汽车生产商的 app 中提供这些功能 让用户可以不必离开 CarPlay 就可以调节车的温度 和收音机 汽车生产商的 app 可以 利用 iPhone 的 网络连接 和强大的开发平台 带来更多汽车相关的 功能 例如 这个汽车生产商的 app 可以利用Siri 来语音控制温度和收音机 设置
汽车生产商的 app 必须由汽车制造商来制作 需要车的制造商提供信息 来控制汽车上的功能 这些 app 必须有一个特定的 CarPlay 协议的 签名授权
它们必须在 CarPlay 里 显示一个用户界面 并且只能在支持的 车型上显示
CarPlay 通过匹配 汽车的外部配件协议 与 app 的 CarPlay 协议权限 来决定某款车型 是否支持某个 汽车生产商的 app 因此 在汽车开发制造过程中 考虑可能的汽车生产商的 app 是很重要的 这样才能保证 汽车配有适当的 协议声明 这个例子展示了 CarPlay 是怎样 将汽车与汽车生产商的 app 相匹配 这个汽车有两个协议的声明 一个是表现的协议 用来采集汽车的数据 还有一个控制温度 的协议
像这儿所显示的那样 协议的名字应该用 反向域名格式 汽车生产商希望 在一个新叫做“跑道”的 app 中 利用有关汽车 表现的数据 这个 app 是为了赛道所设计
该 app 包含了 表现协议以及授权 并且 app 和车 都支持表现协议 所以 “跑道” 将会 显示在 CarPlay 中
汽车生产商的 app 还可以支持多个协议
这个汽车生产商决定 在“跑道”这个 app 成功的基础上 开发一个新的 app 叫做“舒适旅程” 可以根据驾驶者的喜好 很方便的 调节收音机和温度
这个 app 的授权 包括一个温度的协议 和一个新的收音机的协议 该车不支持收音机的协议 但因为车辆和 app 都支持温度协议 “舒适旅程” 这个 app 将会显示在 CarPlay 中
在汽车生产商的 app 开始运行之后 应该询问所支持的外部配件协议 并且在用户界面上 应该只显示 支持的功能 在这个例子中 “舒适旅程”这个 app 应该只显示温度控制 因为该车不支持 收音机协议
这个汽车生产商想开发另外一个 app 叫做“充电” 来显示他们的 电动车充电站 为了让这个 app 只适用于他们自己的电动车 这个汽车生产商在 app 的权限中 设定了一个 新的电子协议 因为这款车 不支持电子协议 “充电”这个 app 将不会显示在 CarPlay 中
开发一个汽车生产商的 app 需要与该汽车 进行信息交换
汽车生产商的 app 必须直接通过 iPhone 使用“外部配件”框架 与车辆进行信息交换
直接通过外部配件 进行交流 提高了 app 的反应速度 并避免了 依赖网络连接
要使用外部配件框架 app 需要像之前演示的那样 定义一个自定义的协议名称 在汽车的软件中 和 app 所检测到的 配件连接事件中 应用这个协议 在建立连接的时候 初始化一个 EA 对话 来建立车中的网络传输
了解更多信息 请参见外部配件编程的 话题
汽车生产商的 app 可以使用 UIKit 来在 CarPlay 的屏幕上 显示用户界面
要创立一个 CarPlay 的接口 app 需检测 UIScreen 连接事件
当屏幕建立连接时 验证连接的屏幕的 特征包含 CarPlay 的惯用语法
除了 CarPlay iOS 还支持 其他外部的显示系统 例如飞机上的 屏幕
屏幕只应该显示有 CarPlay 惯用语法的 CarPlay 内容 这个 app 在 CarPlay 屏幕上 建立了一个 UIWindow 将根视图的控制器设置为 自定义 UI 视图
控制器的子类 让我们看一下这些结合在一起是怎样的
这里是在 CarPlay 中 显示视图控制器的 代码 通常这些代码或者放在 你 UI 程序的委托中 或者放在为这些代码所建的 一个新的类中
首先 我们加上一个新的类 来储存我们 为 CarPlay 所创建的 UIWindow 接下来我们定义一个 叫做 updateCarWindow 的实例方法
要检查是否连接了 CarPlay 的屏幕 我们检测含有 CarPlay 惯用语法的 UIScreen
如果没有含 CarPlay 惯用语法的屏幕存在 我们就取消 之前建立的任何 UIWindow 因为与 CarPlay 的连接 可能断开了 如果 CarPlay 屏幕是连接上的 则初始化一个新的 UIWindow 并建立一个自定义的 rootViewController 在其中包含要在 CarPlay 中 显示的内容
在这里我们使用 UI view controller 的一个子类 叫做 carViewController
这个类需要 被实现 你的 app 可以在连接 CarPlay 之后启动 为了处理这种情况 尽早的在你的 app 中 调用 updateCarWindow 例如在完成 启动的选项里
因为 CarPlay 在你的 app 启动过后 也可以连接 检测 UIScreenDidConnect 和 UIScreenDidDisconnect 通知并调用 UpdateCarWindow 来处理这些事件
UIKit 在 CarPlay 屏幕中的表现 和在 iPhone 主屏幕中的表现 有些不同 UIButtonTypeSystem 以 CarPlay 默认的 显示风格来显示 也是推荐的创建按钮的方法 因为这样一来它的格式和表现 就会与其他 CarPlay app 保持一致
在 CarPlay 中 UITableViewController 可能会 限制表格的长度 对于有导航硬件的车来说 使用 UIFocusEnvironment 以及相关的焦点类 来处理相应的 焦点动作 注意 UIKit 提供的 所有的系统用户界面元素 并不是都可以用在汽车制造商的 app 中
有一些 SiriKit 的意图 是与汽车制造商的 app 相关的
这些意图指令 对所有 app 开放 它们并不需要连接 CarPlay 或者是参与到 一个 CarPlay 的 app 中 但是汽车生产商的 app 是利用这些意图的一个好地方 包括可以锁车 检查汽油使用情况 和按响喇叭 还有一系列的意图 需要连接 CarPlay 而且只能应用在 汽车生产商的 app 上
CarPlay 意图包括控制温度 除霜 控制座椅加热 还有控制收音机和 选择音频来源 的意图 汽车生产商 app 的设计 有一定的规范
首先 要让你的 app 在没有 CarPlay 的情况下 依然可以发挥作用 例如 当断开与 CarPlay 的连接的时候 汽车生产商的 app 可以通过连接因特网 来与汽车进行
信息交换 在设计汽车生产商 app 的时候 考虑兼容的
问题 app 的更新应该继续支持老款的车型 新的功能 不应该影响到 现有的 app 版本 简化用户界面 多数的 CarPlay app 界面 应该只包括基本的互动元素 例如按钮 标签 表格 导航条 和页面标签
最后 如果你的汽车生产商 app 支持的车型上 有硬件的导航装置 要考虑 怎样将焦点在不同的 UI 元素中转移
我们希望你学到了 怎样将一个语音 信息 语音通话或汽车生产商的 app 结合到 CarPlay 中 关于 CarPlay 的 更多信息 请访问 developer.apple.com 你也可以 从相关的讲座中 了解更多内容 “用 Xcode 9 调试程序” 可以告诉你关于 有线连接 CarPlay 调试程序的更多信息 关于 SiriKit 的更多信息 请参考“ SiriKit 最新更新” 以及 “创造最好的 SiriKit 体验”
关于 CarPlay 怎样通过无线工作 请观看“开发无线 CarPlay 系统” 的视频
WWDC 6 的视频 也包括 CallKit 和 CarPlay 系统开发的 话题
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。