大多数浏览器和
Developer App 均支持流媒体播放。
-
与 Siri 日程建议整合
Siri 是及时向用户显示当下所需信息的幕后智能技术。在 iOS 13 中,我们扩展了这一功能,在预订完成后让您的 app 告知 Siri,这样 Siri 便可以在正确的时间发起签到。Siri 还可以在“地图”中提供前往预订地点的路线,并将日程添加到“日历”中,等等。探索如何为您的 app 增添 Siri 日程建议功能。
资源
相关视频
WWDC20
-
下载
(与Siri活动集成建议) 大家下午好 欢迎来到 与Siri活动集成建议演讲 我是Sofiane 是Apple Siri框架团队的一名工程师 今天我将与 我的同事Magnus一起演讲 今天很开心能在这里 和大家讲讲如何将你的app 与Siri活动建议集成
Siri是我们喜爱的虚拟助手 通过SiriKit 你的app就能和Siri一起 做一些比如发送信息 请求乘坐 还有使用捷径 启用app的关键功能
Siri也深入与我们的平台集成 为我们每天使用的app 添加了设备智能
在日历中 Siri是个人的 它知道你的预订并帮你组织你的活动 Siri可以利用你的预订信息 在系统中主动提出积极的建议 在锁屏上 Siri会根据交通情况 提醒你什么时候出发 当你打开地图时 也会得到Siri的建议 让你方便快捷得 获取到达终点的路线 只需一按
当你到达目的地时 Siri会建议你打开请勿打扰模式 这样你就能专注你要做的事情 而这些都基于系统知道你的预订 不管这些预订是在哪里的 不管是邮件中的车辆租赁预订 还是信息中的餐厅预订 或者是在Safari中订的机票 现在在iOS 13中 我们很高兴 向你介绍一款新的API 能够与生态系统直接整合
比如 你在美国航空app内部 查看你的航班预订时 该app会将信息发给系统 Siri就可以利用该信息 自动显示提示 并将该航班添加至你的日历中
Siri之后就会对该航班 在正确的时候 提出积极的建议 显示在刚刚 我提过的所有地方 而所有的这些智能行为 都直接发生在设备上 但我们不止于此 今年 我们希望扩展深度系统集成 并在系统中的更多位置 推广你的app
在iOS 13中 如果你的app支持签到 它会在锁屏中置顶 以便在正确的时间 将用户带入你的app中
在新的iOS 13中 在地图中 当用户在正确的时间进入地图 他们就可以获得 有关其航班的最新信息 还能够帮助他们 获取到登机口的方向
所以Siri会你从预订开始 到你登机为止的 每一步都为你提供帮助
我希望你们也觉得这个功能很酷 但是这是怎么运作的呢
API是SiriKit的一部分 它能够让你做许多事情 比如说创建捷径 发送付款等等 特别是我们今天说的每一点 都是作为Intent 框架的一部分公开
我们支持从餐厅到票务 甚至是交通方式等 一系列类别的预订 今年我们在Intent框架中 我们引入了一个新类 来表示所有这些预订类别的详细信息 所有的新类都继承自 新的IN预订类型 例如 要表示餐厅预订 你可以创建 INRestaurantReservation对象
如果你熟悉SiriKit 你就会认识这个INInteraction API 可以用于创建捷径 所以当用户浏览你app中的预订时 你的app就会创建交互 并发送至系统 交互是由Intent 或者说是Intent响应组成 他们共同代表用户的完整交互
今年 我们引入了 新的IN获取预订细节Intent 这是一个Intent响应 旨在获取与用户预订相关的详细信息 这是你的app 与Siri共享信息的方法
现在Intent响应 用了我们之前看到的 INReservation 对象列表 这代表了你的具体预订 比如说 我要创建一个IN住宿预订 并将其附加至Intent响应 来代表酒店入住细节
你要做的就是将这些交互发送给系统 Siri就可以将其用于 Siri活动建议 或者是Siri捷径等地方
现在我们来说说你的app要做的 简单的三个步骤 来充分利用这些功能 首先我们来说说如何创建及发送交互 接下来是如何采用 新的预订行为API 这样你的app就可以从新的 登记捷径中获益 最后 你的app可能会与你 之前发送的预订一起启动 所以我们也会说到你应该处理的 各种启动方案 现在有请我的同事Magnus上台 来讲讲API 有请Magnus
谢谢你 Sofiane
大家好 我是Magnus 今天我很高兴和大家说说 Siri活动建议
首先我会向你展示 一个如何使用API的演示 之后再谈到细节 我们先来看演示
先来看看这款叫我的航班的app 我们先打开来看看是什么样的
它会显示我的航班预订列表
如果我点击其中一个 它就会显示航班预订信息
我想利用Siri活动建议API 并发送预订细节并向用户显示
让我们转到Xcode
现在我的app中有一些 视图控制器和服务器 我可以在那里获取航班信息详情 因为我想在向用户显示时 发送这些信息 所以让我们看看预订信息视图控制器
视图控制器从服务器中获取预订信息 在这个演示中 服务器会返回 INReservations SiriKit对象
我已经做了一些工作了 但是这里还有一些没有写的代码 标记为待办事项
我们去服务器看看 INReservations对象是由什么组成的
在我的服务器代码中 有一个叫创建航班预订的方法 使用来创建和保存预订信息的 所以我可以从我的视图控制器访问它
我要在这里创建一个 叫INFlightReservation的对象
该方法创建了一个 INFlightReservation的对象 该对象涵盖了所有 航班预订的详细信息
我们来看看其中一些属性
首先是itemReference 这是该预订项目的唯一标识符 它在系统启动我的app时使用 以告知它要显示哪个特定的预订项目
在我的app中 预订编号对于 此次航班来说是唯一的 所以我将它用于词汇表标识符
同时我也加上了可以向 用户显示的口头短语
我用的是航班XX815 简短精悍
这是所有预订类型
共享的一些常见属性 比如预订编号 还有预订持有人等
我们也想获取关于航班的一些信息 它是在一个叫创建航班的 单独方法中创建的 我们来看看
在这里我创建了一个 INFlight对象 它表示了航班的所有详细信息 比如航班号 航空公司 还有出发和到达信息
我这里还有一些待办事项 我们一起来完成 从航空公司和机场信息开始
这些对象表示了航空公司 还有航班出发和到达的信息 在我们的例子中 该航班是从旧金山到巴黎
航空公司和机场信息都使用 IATA或者ICAO代码识别 对于机场信息而言 这也可以用来 确定机场的位置
我来为出发添加登机口和航站楼信息 因为现在我已经知道了
我还不知道到达口的信息 所以我设置为无
接下来 我还要为我的航班 指定出发和到达时间
我们使用IN日期组件范围类 来表示出发和到达时间 为了更好的用户体验 我设置的是当地时区 不好意思 我对出发和到达 设置的都是当地时区
好了 现在我们设置好 所有需要表示航班的信息了 我们回过头看看其他的预订
我想让我的用户有更好的登记体验 所以我就要利用新的登记捷径
为此 我要创建一个登记活动 让我们看看 createCheckInAction方法
该方法会创建一个 INReservation活动 它由类型 有效持续时间和 用户活动组成
在该例中 类型是登记 有效持续时间是用户可以 在线办理登机手续的时间
在此期间 我指定的用户活动 会显示为建议捷径
我从创建 NSUserActivity开始
我用活动类型来创建NS用户活动 这让我的app在启动时 知道这是一个登记活动
我将标题设为航班XX815登记 这里向用户显示的是捷径 所以要确保短小精悍
现在我再添加一些我需要知道的细节 以便在启动app时开始登记流程 我在用户信息都添加 在requiredUserInfoKeys属性中
我还添加了一个网页URL值
这样即使没有安装我的app 也能够使用登记流程
现在我觉得用户活动已经很不错了 但我还需要指定有效持续时间
我们在这里再次使用 EndDateComponents范围 这一次我们使用开始时间和结束时间 来表示有效持续时间 在我们的例子中 登记开始时间是起飞前的24小时 在起飞前一小时结束 所以这就是 我们的有效持续时间
这就是我们创建 登记捷径所需的全部 我们回过头看看我们创建的预订
现在我们有了所需的信息 包括预订细节 航班信息 和登记活动
让我们回到预订细节视图控制器 来添加发送代码
所以我们的视图控制器已经知道了 我们刚刚创建的预订 我就在这里设置一个方式来发送预订 让我们来添加发送代码
我把导航关掉 这样看得清楚一点
那么现在我开始创建Intent 该Intent告诉Siri 该向用户展示什么预订
它需要两个参数 容器参考和项目参考
容器参考是标识整个预订的唯一参数
在该例中 我只有一个 预订项目 那就是航班 所以我将预订项目中的项目参考 设置为容器参考
如果我有多个预订项目 比如说酒店和航班 那么我就会新建一个容器参考 来代表整个预订
我将预订项目参考的属性设为无 这是在启动app时由系统填充的
除了Intent 我还指定了Intent响应 并将其添加至我的预订 这会告诉Siri 应该把哪个预订详情 展示给用户
最后 我将Intent和Intent响应 添加至INInteraction 然后发送至我的系统
现在我们已经写好了所有 发送该预订所需的代码 但我们在启动app前 还要检查一个地方
我要将 INGetReservationDetailsIntent 以及自定义CheckInActivity 添加至info.plist中 支持的活动类型列表 我之前已经做好了 所以我们可以继续
我们先来回顾一下
我们创建并发送了 INFlightReservation 该预订包含了所有预订信息
现在Siri就知道了该预订 并可以在整个系统中提供主动建议了
我们还添加了 INReservation活动 来提供更好的登记体验 我们会将捷径展示给用户 并且在对的时机直接将其 添加至登记流程中
我们来在操作中看看
回到我的app中 我们来看看到巴黎的航班预订
当我查看我的预订时 会弹出一条通知 告诉我Siri找到了一项活动 并将其添加置我的日历中 谢谢
我来点击该通知 看看会出现什么
正如我们所见 Siri利用我发送的信息 在我的Siri建议日历中 创建了活动
这里还有一个回到app的链接
当我点击时 就会直接回到app 这很棒 但是当我在查看日历时 我还是没有看到预订细节 这里我们还可以提升一下 让我们回到Xcode 看看如何实现app启动
为了实现app启动 我要去到app代理
当Siri启动我的app时 它将使用 NSUserActivity启动 所以我要实现app 继续用户活动代理方法
我在这里添加了对 两种活动类型的支持 第一项是 INGetReservationDetailsIntent 此活动类型表示 用户想要在我的app中 查看特定预订的详细信息
所以我要调用 handleShowReservation方法 它会将相关预订展示给用户
第二个是我为登记捷径 定义的活动类型 当用户点击锁屏或者是搜索上的 登记捷径时会启用
当该情况发生时 我要调用 handleCheckIn方法 来开始登记流程
处理完这两项事情后 我们再次启动app看看
我们首先回到日历 再次点击显示我的航班按钮
如你所见 我的app现在会直接显示 活动的预订详细信息 这大大提升了用户体验
我还添加了对登记捷径的支持 我的航班在明天下午2:50起飞 所以现在应该可以登记了
我们来看看这是怎样工作的
现在登记捷径在锁屏 和搜索UI上都有显示 当我点击 我就直接启动了app中的登记流程 这真的很棒
我们来回顾一下 我们创建和发送了预订
我们提供了登记活动
同时我们也处理了启动app
利用Siri活动建议API 来提供深度系统集成和提高用户体验 就是这么简单
现在我还想说说API
我们从发送开始 再说说Siri是如何在 例如捷径建议 和日历这些地方利用你发送的信息的
正如我们在演示中所见 你的app位于登记 捷径的正前方 我们显示了你的app名称和图标 还有预订信息
同样 我们使用你在捷径中 在NSUserActivity上设置的标题 因此 请确保使用准确 且具有描述性的字符串
现在 Siri会端到端加密 自动将预订详情同步至用户设备 所以用户在没有安装 你的app的设备上 也可以看到登记捷径 在我们的情况下是iPad
当该情况发生时 我们将使用你在NSUserActivity上 设置的网页网址属性 利用Safari提供 基于网页的登记流程
这就是登记捷径 我们再来看看日历
第一是标题 标题由Siri自动生成
利用的是你提供的预订详情 如你所见 Siri为标题添加了 本地化的预订类型
根据不同的预订类型 它会使用信息的不同部分来生成标题 因此请确保按原样提供所有详情 不要添加或附加任何内容
接下来是位置
位置是用户体验的关键组成部 它也推动了系统集成 例如出发时间通知和地图集成 对于大多预订类型 SiriKit会使用 CLPlacemark类来表示位置
你可以自己创建 CLPlacemark对象 或者你的app用的是MapKit 你可以从MapKit项目中获取
如果你是自己创建 CLPlacemark对象 一定要包括位置和邮政地址
如果你不知道坐标 就设为00 这样Siri就知道只有邮政地址
接下来就是预订的开始和结束时间
如你所见 该活动显示的开始和结束时间 是用户所在时区和预订所在时区
因此 请确保为预订设置本地时区 或者如果你的app 没有该功能的话 请使用UTC
有些预订类型有着清晰的 开始和结束时间 比如航班 你可以使用计划出发时间 和计划到达时间
对于住宿和汽车租赁等预订 就使用登记入住和退房时间
如果该预订没有特定的 结束时间 就设为无 这样Siri就会根据 预订类型使用来过滤
接下来是Notes部分 Siri使用Notes部分来提供 可能会对用户有用的 关于预订详情的更多信息 例如预订号码或座位信息
请确保填写所有 可能向用户显示的 预订详细信息
最后,Siri提供了一个直接从 日历到你的app的链接 点击即可启动你的app 这样它就可以显示更多 关于预订的信息
我们来看看在你的app中 处理这个问题 你需要知道什么
为了更好地理解启动app 我们回过头看看我们 在发送信息时的步骤 在刚刚的演示里 我们发送了一个预订项目
但现在我们假设有多个预订项目 比如往返航班
这样我们就有两趟航班 可能会共享一个预订编号
这样预订编号就不能用于 唯一标识特定预订项目了
因此你的app必须提供名为 项目参考的附加标识符
对于app的每个预订项 项目参考必须是唯一的
怎么构建项目参考完全取决于你 只要后面能够推断出它属于哪个预订
在这个例子中 我们通过组合共享预订编号 和特定航班号 来创建预订项目
然后我们将两个预订项目 添加至 INGetReservationDetailsIntent响应 完善发送信息 我们还需要创建 INGetReservationDetailsIntent
当我们创建Intent时 我们要告诉Siri 用户查看的是哪个预订
这由容器参考表示
在该例中 我们发送的是 两个属于同一预订的航班 我们将容器参考设置为共享预订编号 因为它唯一地标识了整个预订
最后我们将预订项目参考数组设为无 这当你启动app时才会使用 让它知道用户想要查看哪个预订
这就是信息发送
我们来看看启动app时 这些信息是如何利用的
当你的app启动 以显示预订详细信息时 它会以 INGetReservationDetailsIntent启动
这表示用户想要查看详细信息的预订 在该例中 我们启动该app Intent表示用户 希望详细了解标识为B9C8的预订
如果该预订项目参考数组为无 你的app就会显示一个 全部预订的用户界面 在我们刚刚的例子中 就会显示两趟航班
用户可能还希望查看 有关特定预订的详细信息 比如前一个例子中的某一趟航班
在这种情况下 你的app就会以单个项目填充的 预订项目参考数组启动
它会是你在 INReservation对象中 设置的项目参考
在这种情况下 你的app应该会显示 只有特定预订的界面
在你启动app之前 我们会将Intent包括在INInteraction 和NSUserActivity对象中 有了活动类型 你就可以设置Intent名称 再用其启动app 就像前面的演示那样
我们了解了Siri如何利用 你发送的预订详情 以及该信息之后 会如何启动你的app
但是生活是不确定的 用户可能改变或者取消了他们的预订 而这可能是在你的app外发生的 比如网页
我们现在就来看看怎么处理这种情况
我们先看看什么时候 才是发送信息的时机
在该例中 用户正在浏览 特定预订的详情
这就是你发送信息的时机 就像我们刚刚在演示里看到的 我们会像用户发送通知
同时看到通知和预订详情 会是很好的用户体验
但是在app后台运行的时候 生活可能就会发生变化 而用户应该始终拥有最新信息 所以有新的预订可用时
应将其从后台发送
.在这种情况下 我们就不会 向用户发送通知
这就是你的app发送信息的时机 那么什么时候不该发送信息呢
在刚刚那个演示中 你的app不应该在 显示不相关的预订列表时发送
如果在这时发送通知 会使用户摸不着头脑 因为缺乏上下文
为了提供更好的体验 你的app不应该提供 会直接发送给Siri的的UI元素
在该例中 你的app应该在 预订详情正在显示的时候发送信息
接下来让我们看看预订 可能发生的一些变化
我们以用户选择航班座位为例
我们先发送了预订
这时座位信息还不可用 所以我们将座位属性设为无
现在用户选择了座位 我们就要发送更新的预订详情 也就是座位信息设置
请记住 项目参考在整个 预订生命周期中 都要保持不变
一旦发送 Siri就会将该信息 发送至有关位置 包括日历
现在我们就来说说取消
取消是一种特殊的修改方式
在该例中 我们已经以确认状态发送了此预订
但是用户取消了预订 所以我们还要发送更新信息 既取消状态设置
就像其他修改一样 项目参考要保持一致
这就是app处理这些情况的方式 它可能发生在预订 生命周期的任何时候
现在我们对今天讲的东西做一个总结
我们看到了利用 Siri活动建议API是多么容易 以及我们在预订生命周期内 如何给用户提供更好的体验
以下是三个主要内容
你的app应在向用户显示时 发送预订详细信息 或者是在后台接收时
确保在预订详细信息 发生变化时发送信息 来保证用户拥有最新信息 最后记得处理app启动 这样用户就可以在正确的时间 正确的地点回到app
有关更多信息 以及访问我们的示例代码 你可以访问开发者门户上的演讲链接 我们也有早些年的相关演讲 我也建议你听一听
谢谢大家 希望大家喜欢
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。