Part2: 创建 Intents Extension
在这里放出原文链接地址
Part 2.1: 创建 Intents Extension
Intents Extension
实际上就是在你 App 包里面的 一个 App Extension
, 所有和 SiriKit
进行的交互, 都是通过 Intents Extension
进行的. 尽管大多数时候, 与 SiriKit
进行交互操作都是通过 Intents Extension
进行的, 但是你的 App 仍然需要知道这些交互, 并且在某些时候, 你的 App 还需要对这些交互事件进行一些积极的响应.
当你需要添加一个 Intents Extension
到你的 App 时, 你需要做如下的几个步骤:
- 让你的 App 拥有使用
Siri
的能力. 查看: Configuring Your Xcode Project - 在你的工程中, 添加一个
Intents Extension
的 Target, 并且配置它的Info.plist
文件. 查看: Configuring Your Xcode Project - 在程序运行时, 向你的用户请求使用
Siri
的权限. 查看: Requesting Siri Authorization In Your iOS App - 声明一个用来操作
Intents
的对象. 查看: Resolving And Handling Intents - 为你的 App 定义任何你将会用到的自定义词汇(Custom Vocabulary). 查看: Specifying Custom Vocabulary
注意:
你可以添加一个Intents UI Extension
到你的项目中, 来自定义Siri
或Maps
的显示界面. 需要注意的是,Intents UI Extension
不是Intents Extension
的替代品, 所以当你添加了Intents UI Extension
时, 你还需要添加Intents Extension
. 了解更多内容, 请查看: Creating an Intents UI Extension
了解如何创建 App Extensions
, 请查看: App Extension Programming Guide
了解如何创建 App Extensions
, 请查看: App Extension Programming Guide
Part 2.2: 配置 Xcode 工程
配置 Xcode 工程需要几个步骤, 除了在工程中添加一个 Intents Extension
的 Target 以外, 你还需要对你的 App 做一些小小的修改.
为了使用 SiriKit
, 你需要让你的 App 拥有使用 Siri
的能力. 这其实很简单, 操作步骤就好像你让 App 拥有 iCloud
、推送
、内购买
能力一样. 这将会在你的工程中添加一个 entitlements
, 让 App Store
知道你的 App 是支持 Siri
的.
让你的 App 拥有使用 Siri
能力的几个步骤:
- 在 Xcode 中打开你的工程.
- 在 Xcode 的设置中, 选择你的 App Target.
- 选择 Capabilities 这个标签.
- 打开
Siri
对应的开关.
上一张图, 这样看的更清晰.
操作步骤图例当你为工程添加了使用 Siri
的能力之后, 你就可以为你的工程创建一个 Intents Extension
的 Target 了. 添加这个 Target 后, 将会为你提供几个构建 Intents Extension
时的基础文件, 还会将它添加到你的 App Bundle 中.
添加一个 Intents Extension
需要如下几步:
-
使用 Xcode 打开你的工程.
-
在顶部的菜单栏选择 File > New > Target.
操作步骤图例 -
在出现的对话框中选择对应平台的
操作步骤图例Intents Extension
, 然后点击Next
.
-
为你的
Intents Extension
指定一个名字, 并且配置其他的一些选项. 注意: 如果你希望自定义一部分的Siri
的 UI, 那么你需要勾选Include UI Extension
这个选项. -
配置完之后, 点击 Finish.
注意:
你也许将会在你的工程中添加不止一个Intents Extension
, 但是每一个Extension
都必须要支持不同的Intents
. 一般来说, 为了提供更好的性能 或 减少内存占用的时候, 我们才会创建许多Extension
.
在你的工程中添加了 Intents Extension
的 Target 之后, 配置 Xcode 为你提供的 Info.plist
文件来指定你的 App 都支持哪些 Intents
. SiriKit
使用这个 plist 文件来确定你的 App 都支持哪些 Intents
.
指定支持的 Intents
需要如下几步:
-
在 Xcode 中, 选择
Info.plistIntents Extension
文件夹下的Info.plist
文件. 注意: 在我这个工程中, 则是SiriKitIntentsExtension
文件夹下的Info.plist
文件.
-
在 plist 文件中, 展开
NSExtension
和NSExtensionAttributes
就这两个 key, 然后我们将会看到IntentsRestrictedWhileLocked
和IntentsSupported
这两个 key. -
在
IntentsSupported
这个 key 中, 添加Extension
需要支持的Intent
的字符串. 字符串实际就是Intent
类的名称.IntentsSupported
这个 key 是必须的, 你可以再这里支持所有的Intent
, 也可以是其中的一部分. -
在
IntentsRestrictedWhileLocked
这个 key 中, 你可以添加当屏幕处于锁定状态下的时候支持的Intent
.IntentsRestrictedWhileLocked
是一个可选的 key, 有些Intent
, 例如涉及到了交易的Intent
, 通常都需要用户解锁自己的设备. 你可以使用这个 key 来设置一些默认情况下不需要解锁设备就能够使用的Intent
.
当一个用户语言表达的非常不清晰的时候, SiriKit
将会分析出很多的 Intent
, 此时 SiriKit
就将会使用你提供的 IntentsSupported
key 所对应的内容, 根据内容的顺序来确定将哪一个 Intent
发送给你的 App. 在你组织 IntentsSupported
key 所对应的内容的时候, 你应该将和你 App 最相关的一条放在第一位. 当你支持不同领域的 Intent
并且 这些领域的语义又很接近的时候, 区分 Intent
的先后顺序是非常有意义的. 例如: 你的 App 同时支持打电话和发信息的时候, 你也许希望发送信息的行为优先于打电话的行为.
有些Intent
需要一些额外的配置步骤. 例如: 当你在实现一个旅行预订的 App 时, Maps
期待你可以提供一个 GeoJSON
文件来描述你服务的覆盖范围. 更多详细的配置步骤, 请查看: Intents Domains
Part 2.3: 为你的 App 请求用户许可
在你的 App 使用 SiriKit
之前, 必须要经过用户的许可才行. 请求用户的许可需要如下几个步骤:
- 在你项目中的
Info.plist
文件中, 添加NSSiriUsageDescription
这个 key, 这个 key 对应的是一个字符串的值, 该字符串描述了在你的 App 中SiriKit
的应用场景. - 在项目中调用
INPreferences
的requestSiriAuthorization:
类方法.
当你的 App 第一次调用 requestSiriAuthorization:
方法时, 系统将会弹出一个提示框来询问用户是否授权你的 App 使用 SiriKit
, 这个提示框中包含了上文提到的 NSSiriUsageDescription
这个 key 所对应的值, 就是刚才我们在 info.plist
中配置的字符串. 此时用户可以选择接受, 同样也可以选择拒绝. 无论用户选择了哪一项, 他都可以去 Setting
中修改你 App 的授权状态. 系统会将你 App 的授权状态记录下来, 所以在接下来再次调用 requestSiriAuthorization
方法时将不会再一次向用户弹出授权的提示框.
Part 2.4: 测试你的 Extension
测试 Extension
的时候, 需要是用真机才行. Xcode 允许你直接在工程中运行 Extension
, 并且可以再真机运行的同时对其进行 Debug 操作.
在你的设备中运行 Extension
:
- 选择
Intents Extension
的 scheme. (当你在工程中添加了一个Intents Extension
的 Target 之后, Xcode 会自动生成一个对应的 scheme) - 对你的 scheme 进行配置.
-
Command + R
运行. - Xcode 会弹出一个提示, 此时选择
Siri
或Maps
来运行. Xcode 将会构建你的 App 和Extension
, 在你的设备中安装并且运行它们.
当你第一次安装 Extension
的时候, Siri
可能无法直接识别出你的 Extension
. 所以在你测试相关指令之前, 你可能需要耐心的等待几分钟. 同样的, 如果你更新了你的 Info.plist
文件, 你可能也需要耐心的等几分钟让 Siri
来识别你的修改.
Lemon龙说:
如果您在文章中看到了错误 或 误导大家的地方, 请您帮我指出, 我会尽快更改
如果您有什么疑问或者不懂的地方, 请留言给我, 我会尽快回复您
如果您觉得本文对您有所帮助, 您的喜欢是对我最大的鼓励
如果您有好的文章, 可以投稿给我, 让更多的 iOS Developer 在简书这个平台能够更快速的成长