Part5: 创建 Intent UI Extension

在这里放出原文链接地址

Part 5.1: 创建一个 Intents UI Extension

当你处理一个 Intent 时, SiriMaps 通常会使用一个默认的 UI 界面将 Intents Extension 返回的响应者对象( response object ) 中的详细内容展示给用户, 如果你希望在此基础上添加你自定义的 UI 界面, 此时你需要添加一个 Intents UI Extension.

Intents UI Extension 不会替代你用来处理 Intent 对象的 Intents Extension. 它是一个单独的 App 扩展, 使用它来自定义你的 UI 界面, 向用户展示响应者对象( response object ) 中的内容. 你可以在它上面添加你 App 的标识, 也可以在它上面添加一些附加的信息, 如此一来, 你可以给用户一种很熟悉的感觉.

当你支持一下场景( domains ) 时, 你可以提供 Intents UI Extension:

  • 消息 ( Messaging )
  • 支付 ( Payments )
  • 旅行预订 ( Ride booking )
  • 健身 ( Workouts )

Intents UI Extension 中最主要的一个对象是一个 View Controller, 使用它来自定义你向用户所展示的内容. 一个Intents UI Extension 中只有一个 View Controller, 所以它必须有能力显示所有你所支持场景( domains ) 的内容. 当然, 你也可以为你每一个支持的场景 ( domains ) 分别创建一个 Intents UI Extension.

Part 5.2: 配置你的 Xcode 工程

当你创建一个 Intents Extension 时, 你可以同时创建一个 Intents UI Extension, 当然, 只要你有需要, 你在任何时间单独添加 Intents UI Extension 也是没问题的.

在项目中添加一个新的 Intents UI Extension:

  1. 使用 Xcode 打开你的工程.

  2. 选择 File -> New -> Target


  3. 在 iOS 标签下选择 Intents UI Extension, 点击 Next.

  4. 指定文件名称、开发语言以及其他的选项. 点击 Finish.

Xcode 提供的模板包含了一个 Storyboard 文件, 其中包含了一个初始的视图控制器, SiriMaps 会通过 Storyboard 中的初始视图控制器来向用户显示你的自定义内容, 所以先将初始视图控制器的内容初始化成你想要展示的默认内容. 你也可以在 Storyboard 文件中添加新的视图控制器, 将新添加的视图控制器作为初始视图控制器的子视图控制器来使用. 所以为了你自定义 UI 可以正确的显示你想要的内容, 你有责任去管理初始视图控制器和新建视图控制器之间的所有交互过程.

Intents UI Extension 中的 Info.plist 文件将会向SiriKit 提供一些信息, 你的Intents UI Extension都支持哪些 Intents 就是在这个文件中配置的. 下面表格中展示的3个 Key, 是你必须在Info.plist 中包含的. 另外需要注意的是 NSExtensionAttributes 这个 Key, 你需要在这个 Key 中详细说明你的 Intents UI Extension 都支持哪些场景.

Key 描述
NSExtensionAttributes 该 Key 对应的值是一个字典, 该字典中必须包含 IntentsSupported Key, 该 Key 对应的值是一个字符串数组. 这些字符串的值实际就是你所支持的 Intent 的类名. 配置这个 Key 就跟配置 Intents extension 时一样.
NSExtensionMainStoryboard 该 Key 对应的值就是你显示自定义内容的 Storyboard 名称. 如果你不想使用 Storyboard 而是使用代码来初始化你的视图控制器, 你可以使用NSExtensionPrincipalClass这个 Key 来替换NSExtensionMainStoryboard.
NSExtensionPointIdentifier 该 Key 的内容必须为 com.apple.intents-ui-service.

指定 Intents UI Extension 所支持的 Intent:

  1. 选择你的 Info.plist 文件.

  2. 展开NSExtensionNSExtensionAttributes 这两个 Key.

  3. IntentsSupported Key 中添加你需要支持的 Intent, 字符串类型, 值则是 Intent 的类名.

了解更多配置 Info.plist 的内容, 请查看: Information Property List Key Reference

Part 5.3: 实现你的视图控制器

Storyboard 中的初始视图控制器, 就是用来向用户展示自定义内容的. 在向用户展示你的自定义 UI 界面之前, SiriMaps 将会先加载初始视图控制器, 并且调用其中的 configureWithInteraction:context:completion: 方法, 实现这个方法时, 使用该方法提供的交互对象( interaction object ) 来配置你视图控制器中需要显示的内容. context 参数将会告诉你视图控制器应该显示 SiriMaps 的内容, 所以此时你是有机会通过这个参数来判断你应该向用户展示哪些自定义内容的.

在用户 dismissSiriMaps 之前, 你的视图控制器都是显示在屏幕中的, 你可以使用 Timer 或其他的一些技术来更新你的界面. 该视图控制器同样遵守普通视图控制器的生命周期, 例如显示、隐藏之类的, 不同的是, 该视图控制器是不接收任何触摸事件的, 而且你也不可以在上面添加任何手势. 所以在该控制器上不要创建任何需要用户交互的试图.

下图中展示的是 Intents UI Extension 和 它的视图控制器的生命周期. 系统创建视图控制器, 并且调用configureWithInteraction:context:completion: , 并且该方法会传入一个交互对象 ( interaction object ), 用这个对象来配置你的界面. 一旦配置完成, 你的视图控制器将会显示在屏幕中, 当你的视图控制器出现在屏幕上以后, 你可以做一些动画之类的操作, 也可以使用 Timer 或其他的一些技术来实现你界面的更新逻辑, 但是请记住, 它是不接受任何事件的.

图片来自官方文档

注意:
当视图控制器出现在屏幕上以后, Maps 将会再一次调用configureWithInteraction:context:completion: 方法将需要更新的信息发送给你, 让你来显示最新的内容. 例如: Maps 将会调用这个方法, 将旅行预订的最新状态发送给你, 利用这个时机来更新你的界面.

当用户 dismissSiriMaps 以后, 系统将会 release 掉对视图控制器和 Intents UI extension 的引用. 你的视图控制器仅仅用来展示信息就可以了, 当视图控制器从屏幕中消失的时候, 不要试图保存任何数据 或 和你的 App 产生任何的联系.

对于如何实现 Intents UI extension 中的视图控制器, 这里给出几条建议:

  • 在视图控制器中添加你App的标识: 使用你 App 的主色调、图片、图标, 以及其他的一些设计元素来提升用户对你 Intents UI extension 的熟悉感是一个不错的选择.
  • 通过初试视图控制器的子视图控制器来切换你要显示的内容: Intents UI extension 中仅包含了一个主视图控制器(初试视图控制器), 所以当你希望根据不同的 Intent来显示不同的内容时, 你可以使用子视图控制器来管理不同 Intent 所对应的不同内容. 在configureWithInteraction:context:completion: 方法中, 根据不同的 Intent 对象初始化不同的视图控制器.
  • 只有当你视图控制器完全显示, 你才可以做一些动画操作: 等到视图控制器声明周期到达 viewDidAppear: 之后, 再提交你的动画. 停止动画则需要在 viewWillDisappear: 方法中.
  • 尽可能快的配置视图控制器的 View: 由于你的视图控制器在屏幕中显示的时间不会很长, 所以尽可能使用一些本地的数据和configureWithInteraction:context:completion: 方法中提供的交互对象( interaction object ) 来配置你的视图. 如果你需要从服务器上获取一些数据来进行显示, 此时你应该异步的进行数据请求, 当请求成功后再来刷新你的页面.
  • 不要在你的界面中添加广告: 你可以添加一些和用户相关的信息, 但是广告这东西是被禁止的.
  • 当你希望隐藏掉你的自定义界面时, 返回一个 CGSizeZero 就可以了: 当你的视图控制器没有任何附加信息需要展示给用户时, 你可能需要隐藏掉你的视图控制器, 此时你可以在 configureWithInteraction:context:completion: 方法中回调 completion block 时传入一个 CGSizeZero 就可以了.

了解更多关于配置视图控制器的内容, 请查看: INUIHostedViewControlling Protocol Reference

Part 5.4: 替换默认的界面

对于一个旅行预订( Ride booking ) 或消息( Messaging ) 相关的 App 来说, 如果系统提供的默认 UI 和你提供的 UI 产生了冲突, 那么此时你可以将系统提供的 UI 隐藏掉. 对于消息( Messaging ) App 来说, Siri 默认会展示消息的内容和消息接收者. 对于旅行预订( Ride booking ) App 来说, SiriMaps 将会展示一个地图来显示用户的位置. 如果你想用你的自定义界面来显示相同的信息, 使用 INUIHostedViewSiriProviding 协议来禁止系统提供默认界面的显示.

了解更多禁止默认页面显示的内容, 请查看: INUIHostedViewSiriProviding Protocol Reference

Lemon龙说:

如果您在文章中看到了错误 或 误导大家的地方, 请您帮我指出, 我会尽快更改

如果您有什么疑问或者不懂的地方, 请留言给我, 我会尽快回复您

如果您觉得本文对您有所帮助, 您的喜欢是对我最大的鼓励

如果您有好的文章, 可以投稿给我, 让更多的 iOS Developer 在简书这个平台能够更快速的成长

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 在这里放出原文链接地址 Part 2.1: 创建 Intents Extension Intents Extens...
    李国安阅读 3,389评论 1 2
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,708评论 22 664
  • 介绍SiriKit SiriKit是让你的内容通过Siri展示的一个框架库。当用户向Siri请求特别类型的服务时,...
    孢子菌阅读 4,247评论 1 6
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,022评论 4 62
  • 回家乡了,车子穿梭在一路上的五彩斑斓中,好美的秋色!轻松的心绪,浏览着错落有致的彩林,没有思想的负累…… ...
    如梦过儿阅读 456评论 0 5