-
与 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
大家好 我是Magnus 今天我很高兴和大家说说 Siri活动建议
首先我会向你展示 一个如何使用API的演示 之后再谈到细节 我们先来看演示
现在我的app中有一些 视图控制器和服务器 我可以在那里获取航班信息详情 因为我想在向用户显示时 发送这些信息 所以让我们看看预订信息视图控制器
视图控制器从服务器中获取预订信息 在这个演示中 服务器会返回 INReservations SiriKit对象
我已经做了一些工作了 但是这里还有一些没有写的代码 标记为待办事项
我们去服务器看看 INReservations对象是由什么组成的
在我的服务器代码中 有一个叫创建航班预订的方法 使用来创建和保存预订信息的 所以我可以从我的视图控制器访问它
我要在这里创建一个 叫INFlightReservation的对象
该方法创建了一个 INFlightReservation的对象 该对象涵盖了所有 航班预订的详细信息
首先是itemReference 这是该预订项目的唯一标识符 它在系统启动我的app时使用 以告知它要显示哪个特定的预订项目
在我的app中 预订编号对于 此次航班来说是唯一的 所以我将它用于词汇表标识符
我们也想获取关于航班的一些信息 它是在一个叫创建航班的 单独方法中创建的 我们来看看
在这里我创建了一个 INFlight对象 它表示了航班的所有详细信息 比如航班号 航空公司 还有出发和到达信息
我这里还有一些待办事项 我们一起来完成 从航空公司和机场信息开始
这些对象表示了航空公司 还有航班出发和到达的信息 在我们的例子中 该航班是从旧金山到巴黎
航空公司和机场信息都使用 IATA或者ICAO代码识别 对于机场信息而言 这也可以用来 确定机场的位置
我们使用IN日期组件范围类 来表示出发和到达时间 为了更好的用户体验 我设置的是当地时区 不好意思 我对出发和到达 设置的都是当地时区
好了 现在我们设置好 所有需要表示航班的信息了 我们回过头看看其他的预订
为此 我要创建一个登记活动 让我们看看 createCheckInAction方法
该方法会创建一个 INReservation活动 它由类型 有效持续时间和 用户活动组成
在该例中 类型是登记 有效持续时间是用户可以 在线办理登机手续的时间
我用活动类型来创建NS用户活动 这让我的app在启动时 知道这是一个登记活动
我将标题设为航班XX815登记 这里向用户显示的是捷径 所以要确保短小精悍
现在我再添加一些我需要知道的细节 以便在启动app时开始登记流程 我在用户信息都添加 在requiredUserInfoKeys属性中
我们在这里再次使用 EndDateComponents范围 这一次我们使用开始时间和结束时间 来表示有效持续时间 在我们的例子中 登记开始时间是起飞前的24小时 在起飞前一小时结束 所以这就是 我们的有效持续时间
这就是我们创建 登记捷径所需的全部 我们回过头看看我们创建的预订
所以我们的视图控制器已经知道了 我们刚刚创建的预订 我就在这里设置一个方式来发送预订 让我们来添加发送代码
那么现在我开始创建Intent 该Intent告诉Siri 该向用户展示什么预订
在该例中 我只有一个 预订项目 那就是航班 所以我将预订项目中的项目参考 设置为容器参考
如果我有多个预订项目 比如说酒店和航班 那么我就会新建一个容器参考 来代表整个预订
我将预订项目参考的属性设为无 这是在启动app时由系统填充的
除了Intent 我还指定了Intent响应 并将其添加至我的预订 这会告诉Siri 应该把哪个预订详情 展示给用户
最后 我将Intent和Intent响应 添加至INInteraction 然后发送至我的系统
现在我们已经写好了所有 发送该预订所需的代码 但我们在启动app前 还要检查一个地方
我要将 INGetReservationDetailsIntent 以及自定义CheckInActivity 添加至info.plist中 支持的活动类型列表 我之前已经做好了 所以我们可以继续
我们创建并发送了 INFlightReservation 该预订包含了所有预订信息
现在Siri就知道了该预订 并可以在整个系统中提供主动建议了
我们还添加了 INReservation活动 来提供更好的登记体验 我们会将捷径展示给用户 并且在对的时机直接将其 添加至登记流程中
当我查看我的预订时 会弹出一条通知 告诉我Siri找到了一项活动 并将其添加置我的日历中 谢谢
正如我们所见 Siri利用我发送的信息 在我的Siri建议日历中 创建了活动
当我点击时 就会直接回到app 这很棒 但是当我在查看日历时 我还是没有看到预订细节 这里我们还可以提升一下 让我们回到Xcode 看看如何实现app启动
当Siri启动我的app时 它将使用 NSUserActivity启动 所以我要实现app 继续用户活动代理方法
我在这里添加了对 两种活动类型的支持 第一项是 INGetReservationDetailsIntent 此活动类型表示 用户想要在我的app中 查看特定预订的详细信息
所以我要调用 handleShowReservation方法 它会将相关预订展示给用户
第二个是我为登记捷径 定义的活动类型 当用户点击锁屏或者是搜索上的 登记捷径时会启用
当该情况发生时 我要调用 handleCheckIn方法 来开始登记流程
如你所见 我的app现在会直接显示 活动的预订详细信息 这大大提升了用户体验
我还添加了对登记捷径的支持 我的航班在明天下午2:50起飞 所以现在应该可以登记了
现在登记捷径在锁屏 和搜索UI上都有显示 当我点击 我就直接启动了app中的登记流程 这真的很棒
利用Siri活动建议API 来提供深度系统集成和提高用户体验 就是这么简单
我们从发送开始 再说说Siri是如何在 例如捷径建议 和日历这些地方利用你发送的信息的
正如我们在演示中所见 你的app位于登记 捷径的正前方 我们显示了你的app名称和图标 还有预订信息
同样 我们使用你在捷径中 在NSUserActivity上设置的标题 因此 请确保使用准确 且具有描述性的字符串
现在 Siri会端到端加密 自动将预订详情同步至用户设备 所以用户在没有安装 你的app的设备上 也可以看到登记捷径 在我们的情况下是iPad
当该情况发生时 我们将使用你在NSUserActivity上 设置的网页网址属性 利用Safari提供 基于网页的登记流程
利用的是你提供的预订详情 如你所见 Siri为标题添加了 本地化的预订类型
根据不同的预订类型 它会使用信息的不同部分来生成标题 因此请确保按原样提供所有详情 不要添加或附加任何内容
位置是用户体验的关键组成部 它也推动了系统集成 例如出发时间通知和地图集成 对于大多预订类型 SiriKit会使用 CLPlacemark类来表示位置
你可以自己创建 CLPlacemark对象 或者你的app用的是MapKit 你可以从MapKit项目中获取
如果你是自己创建 CLPlacemark对象 一定要包括位置和邮政地址
如果你不知道坐标 就设为00 这样Siri就知道只有邮政地址
如你所见 该活动显示的开始和结束时间 是用户所在时区和预订所在时区
因此 请确保为预订设置本地时区 或者如果你的app 没有该功能的话 请使用UTC
有些预订类型有着清晰的 开始和结束时间 比如航班 你可以使用计划出发时间 和计划到达时间
如果该预订没有特定的 结束时间 就设为无 这样Siri就会根据 预订类型使用来过滤
接下来是Notes部分 Siri使用Notes部分来提供 可能会对用户有用的 关于预订详情的更多信息 例如预订号码或座位信息
最后,Siri提供了一个直接从 日历到你的app的链接 点击即可启动你的app 这样它就可以显示更多 关于预订的信息
为了更好地理解启动app 我们回过头看看我们 在发送信息时的步骤 在刚刚的演示里 我们发送了一个预订项目
怎么构建项目参考完全取决于你 只要后面能够推断出它属于哪个预订
在这个例子中 我们通过组合共享预订编号 和特定航班号 来创建预订项目
然后我们将两个预订项目 添加至 INGetReservationDetailsIntent响应 完善发送信息 我们还需要创建 INGetReservationDetailsIntent
当我们创建Intent时 我们要告诉Siri 用户查看的是哪个预订
在该例中 我们发送的是 两个属于同一预订的航班 我们将容器参考设置为共享预订编号 因为它唯一地标识了整个预订
最后我们将预订项目参考数组设为无 这当你启动app时才会使用 让它知道用户想要查看哪个预订
当你的app启动 以显示预订详细信息时 它会以 INGetReservationDetailsIntent启动
这表示用户想要查看详细信息的预订 在该例中 我们启动该app Intent表示用户 希望详细了解标识为B9C8的预订
如果该预订项目参考数组为无 你的app就会显示一个 全部预订的用户界面 在我们刚刚的例子中 就会显示两趟航班
用户可能还希望查看 有关特定预订的详细信息 比如前一个例子中的某一趟航班
在这种情况下 你的app就会以单个项目填充的 预订项目参考数组启动
它会是你在 INReservation对象中 设置的项目参考
在你启动app之前 我们会将Intent包括在INInteraction 和NSUserActivity对象中 有了活动类型 你就可以设置Intent名称 再用其启动app 就像前面的演示那样
我们了解了Siri如何利用 你发送的预订详情 以及该信息之后 会如何启动你的app
但是生活是不确定的 用户可能改变或者取消了他们的预订 而这可能是在你的app外发生的 比如网页
这就是你发送信息的时机 就像我们刚刚在演示里看到的 我们会像用户发送通知
但是在app后台运行的时候 生活可能就会发生变化 而用户应该始终拥有最新信息 所以有新的预订可用时
在刚刚那个演示中 你的app不应该在 显示不相关的预订列表时发送
为了提供更好的体验 你的app不应该提供 会直接发送给Siri的的UI元素
现在用户选择了座位 我们就要发送更新的预订详情 也就是座位信息设置
但是用户取消了预订 所以我们还要发送更新信息 既取消状态设置
这就是app处理这些情况的方式 它可能发生在预订 生命周期的任何时候
我们看到了利用 Siri活动建议API是多么容易 以及我们在预订生命周期内 如何给用户提供更好的体验
你的app应在向用户显示时 发送预订详细信息 或者是在后台接收时
确保在预订详细信息 发生变化时发送信息 来保证用户拥有最新信息 最后记得处理app启动 这样用户就可以在正确的时间 正确的地点回到app
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。