作者 | 阿里文娱高级无线开发工程师 子荀

责编 | 屠敏

随着 iOS 13 的正式发布,SiriKit 开始支持音视频内容播放。例如,用户说“Hey Siri,使用优酷播放《乡村爱情12》”,优酷会自动打开并播放《乡村爱情12》。这是一次新功能的探索和尝试,优酷主客开始相应的技术预研。

这篇文章是对优酷接入 SiriKit 的总结,介绍了整个项目的实施流程和经验教训。随着 iOS 13 的占比越来越高,相信 Siri 的相关功能也会被音视频类的 App 接入。希望我们的心得分享能帮助到大家。

SiriKit 概述

SiriKit 将用户对 Siri 的请求分发到对应的 App 中。SiriKit 包含了 Intents和 IntentsUI 框架。它们都是应用程序的拓展,可以拓展 App 的自定义功能和内容。

  • Intents:用户可以发出的请求类型,它被转换为应用程序的操作。类型包含INPlayMediaIntent、INSearchForMessagesIntent、INStartWorkoutIntent 等。

  • IntentsUI:在 Siri 中显示自定义的内容,这个拓展是可选的。

了解完 Intents 和 Intents UI 后,还需要了解 Domains (域)。

  • Domains:将 Intent 分组,只有用户的请求在特定的域中才可以被支持,包含 Messaging、Workouts、Media等。优酷使用的是 Media 域。

注意:SiriKit 会忽略在 MacOS 上运行的 iPad App。

优酷接入 SiriKit的流程

1. 在 Sign & Capabilities 中添加 Siri 权限。

2. 创建 App Extension。因为我们要通过 Siri 直接唤醒优酷,所以创建 Intents Extension 即可,无需创建 Intents UI Extension。

3. 在创建完 App Extension 之后,需要对它进行一些设置:

  • Bundle Identifier:Xcode 自动生成,无需改动;

  • Target:Target 版本设置。笔者的 Xcode 版本为11.2.1 创建的App Extension Target 默认版本为13.2,但是优酷需要从 13.0 开始支持。这个地方一开始没有注意到,导致在 iOS 13.2 以下的系统中无法通过 Siri 唤起优酷;

  • Supported Intents:在 Class Name 中添加类 INPlayMediaIntent 之后会自动出现 Media Categories 选项,该选项包含了 Music、Podcasts、Audiobooks、Radio、General。因为优酷为视频类 App,根据苹果官方的建议选择的类型为 General,即通用类型;

4. 创建完 Siri Extension 之后,会在项目工程中自动生成一个 Siri 分组,默认文件为 IntentHandler.h 和IntentHandler.m。分组为创建的 App Extension 名称。

5. 在IntentHandler.m 处理相关逻辑。这里直接贴上主要代码并对代码做些讲解:

- (void)resolveMediaItemsForPlayMedia:(INPlayMediaIntent *)intent withCompletion:(void (^)(NSArray<INPlayMediaMediaItemResolutionResult *> *resolutionResults))completion
{// 描述媒体内容INMediaItem *item = [[INMediaItem alloc] initWithIdentifier:@"SiriItem" title:intent.mediaSearch.mediaName type:INMediaItemTypeMovie artwork:nil];// 媒体项目类型的解析结果INMediaItemResolutionResult *sr = [INMediaItemResolutionResult successWithResolvedMediaItem:item];NSMutableArray *mutableArray = [NSMutableArray array];INPlayMediaMediaItemResolutionResult *irs = [[INPlayMediaMediaItemResolutionResult alloc] initWithMediaItemResolutionResult:sr];[mutableArray addObject:irs];completion(mutableArray);
}- (void)handlePlayMedia:(nonnull INPlayMediaIntent *)intent completion:(nonnull void (^)(INPlayMediaIntentResponse * _Nonnull))completion
{NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INPlayMediaIntent class])];INMediaItem *item = [intent.mediaItems firstObject];if (item.title.length > 0) {userActivity.userInfo = @{@"title" : item.title, @"source" : @"siri"};} else {userActivity.userInfo = @{@"title" : @"大明风华", @"source" : @"siri"};}// media Intent 的回应INPlayMediaIntentResponse * re = [[INPlayMediaIntentResponse alloc] initWithCode:INPlayMediaIntentResponseCodeContinueInApp userActivity:userActivity];completion(re);
}

从函数resolveMediaItemsForPlayMedia:withCompletion:中可以获得需要需要播放的媒体项目。例如:用户说“使用优酷播放大明风华”,就可以从intent.mediaSearch.mediaName 拿到“大明风华”这四个文字。拿到文字后需要创建一个INMediaItem 类型的对象,该对象描述了对应的媒体内容。接下来通过INMediaItem类型的对象创建 INMediaItemResolutionResult 类型的对象,该对象代表着媒体项目类型的解析结果。

执行完函数resolveMediaItemsForPlayMedia:withCompletion:会执行函数 handlePlayMedia:completion:,该函数的作用是处理媒体请求。因为 Intents 应用程序的生命周期非常短,所以 INPlayMediaIntent 告诉主程序开始媒体播放。这里的媒体播放分为两种:

  • Audio:对于音频内容使用INPlayMediaIntentResponseCodeHandleInApp 进行响应。它会告诉系统在后台启动主程序,在 UIApplicationDelegate 对象上调用方法 application:handleIntent:completionHandler:。应用程序应使用此应用程序委托方法开始音频播放;

  • Video: 对于视频内容使用 INPlayMediaIntentResponseCodeContinueInApp进行响应。它会告诉系统系统在前台启动主程序,在 UIApplicationDelegate 对象上调用方法 application:continueUserActivity:restorationHandler:。应用程序应使用此应用程序委托方法开始视频播放。

在函数handlePlayMedia:completion:里面创建 INPlayMediaIntentResponse 类型对象,它是对 mediaIntent的回应,注意创建该对象的时候需要传入正确的INPlayMediaIntentResponseCode。

至此 Siri Extension 数据的获取已经完成,接下来的任务是将 Siri 获取到的数据转换为对应的媒体资源。

优酷对 SiriKit 传递的信息处理

从流程图中可知对于优酷这种巨型 App 来说 App 内部的信息处理和传递,处理链路非常长,过程比较复杂复杂。

处理流程涉及到了壳程序、一个公共 Bundle、播放页Bundle。

为什么呢?因为优酷业务非常多,代码量巨大,所以将不同的业务拆分成了不同的 Bundle,每条业务线维护自己的 Bundle,每次集成发版本,业务线构建自己的 Bundle,最后通过壳工程将所有业务线的 Framework 集成到一起构建成完整的优酷 App。

Siri Extension 是添加在壳工程里面,而 Siri 的回调在公共 Bundle 里面,搜索、跳转播放的逻辑在播放页 Bundle 里面。

由于壳工程里面主要就是 Siri Extension 的添加,所以这里主要说下公共 Bundle 和播放页 Bundle 这两个 Bundle 的流程。

  • 公共 Bundle 处理:这个 Bundle 非常重要,它链接了壳工程和播放页Bundle。这里主要涉及到两个问题:一是开屏广告的处理。二是不要将过于复杂的业务放在其中;其次为降低跨团队的沟通成本,只在 Bundle 留一个入口,将所有的业务逻辑放到播放页的 Bundle 中去处理。

  • 针对第一点的处理:当 Siri 唤起主包时,有可能是存在广告的,此时不能立即跳转到播放页进行播放,需要等广告结束之后再跳转。这与唤端的逻辑是类似的。

  • 针对第二点处理:通过一个单例类,创建这个单例类的时候将所需要的数据传递进去。并且公共 Bundle 也没有直接依赖播放页的 Bundle,而是通过 NSClassFromString + performSelector 的方式进行调用。

下面是简单的代码示例:

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
{// 判断 NSUserActivity 的类型,确认是 Siri Extension 传过来的if ([userActivity.activityType isEqualToString:@"INPlayMediaIntent"]) {Class siriManagerClass = NSClassFromString(@"YKSiriManager");SEL selctor = NSSelectorFromString(@"creatInstanceWithUserActivity:");if (siriManagerClass && [siriManagerClass respondsToSelector:selctor]) {[siriManagerClass performSelector:selctor withObject:userActivity];}return YES;}
}
  • 播放页 Bundle 处理:这个 bundle 主要是调用搜索 SDK 将剧集名称转化成对的播放视频链接,最后跳转到播放页进行视频播放,主要是搜索参数的拼接和跳转逻辑。

SiriKit 接入后的界面展示:

总结:接入 SiriKit 所踩的坑

目前,优酷 App 已经接入 SiriKit ,已在 App Store 上架。如果你的 App 也希望接入,以下这些防“坑”指南希望能帮到你。

  • 确保 Siri 的 bundle ID 正确;

  • 创建 Siri Extension 注意 target 所支持的版本号,默认是当前 Xcode 所支持的最高版本号;

  • 提交审核时候注意 Siri Extension 的 Support Intents 的class Name 里面只包含 Intent 的类型,不然会报以下错误:

  • 因为涉及到证书和 Profile 的变化一定要提前修改好相关配置。并提示各个业务线进行行相关修改和测试;

  • 有些文字 Siri 无法识别,例如:用优酷播放催眠,在函数handlePlayMedia:completion: 中拿到的 item.title 为 nil 此时需要对这个异常情况进行处理。比如我们可以通过配置平台下发一个剧集名称来处理这种异常。

推荐阅读 

☞GitHub 移动端正式发布!

☞GitHub 标星 11000+,阿里开源的微服务组件如何连续 10 年扛住双十一大促?

☞检测、量化、追踪新冠病毒,基于深度学习的自动CT图像分析有多靠谱?

☞深度学习“三巨头”、图灵奖得主 Yann LeCun:我没有天赋,所以才追随聪明人

☞Docker 开发环境的滑坡

☞来,让我们逐一澄清以太坊 2.0 五大误解

你点的每一个在看,我认真当成了喜欢

如何通过 Siri 播放视频?且看优酷技术接入实践相关推荐

  1. 优酷在线播放器 html5,看优酷,用HTML5

    大家都说Safari好用,我也觉得挺好用的:大家都说ClickToPluginForChina很好用,可是我却死活用不起来.虽然2020年底Adobe将停止支持Flash,但是在此之前的日子还是要过. ...

  2. 提升研发效能没那么难,看优酷的最佳实践!

    作者 | 阿里文娱技术专家 成文 责编 | 屠敏 研发效能期望 随着敏捷.DevOps 等概念的兴起,研发效能成为企业关注的重点,但是研发效能面临的问题和挑战也与日俱增.尤其在互联网行业,版本需要快速 ...

  3. MacBook Pro 安装了flash Player,还是不能看优酷土豆视频

    最近买了部苹果电脑,可是突然想到要去优酷网上看看视频,结果,说电脑没有安装flash插件!所以就按着步骤一步一步的去安装,一切都很顺利,可是就在我重启完之后想去看视频的时候,却发现空白一片,什么都没有 ...

  4. 优酷html5视频没有弹幕,优酷弹幕怎么设置 优酷PC端怎么屏蔽底下弹幕?

    电脑版优酷打开弹幕步骤: 打开电脑浏览器,在地址栏输入优酷官网地址,进入优酷官网. 进入优酷官网后,点击想要观看的影片并播放. 影片非全屏播放时,在播放界面有一个全屏符号,点击该符号进入全屏播放模式. ...

  5. 优酷视频下载器 优酷视频下载方法

    iku爱酷V2.1版优酷视频加速器下载优酷视频下载器 iku爱酷V2.1版优酷视频加速器. 视频加速器播放速度更快!下载速度更快!旋风般的加速感觉! 视频下载看下载优酷站内视频,充分满足你的收藏欲. ...

  6. 鸿蒙开发者公测版本bug,用华为鸿蒙看优酷无广告:明显是BUG,不是特意搞的噱头...

    随着华为对公测用户推送鸿蒙 OS 2.0 开发者 Beta 公测版,越来越多的用户体验到了鸿蒙系统了. 而从体验来看,很多人表示,与安卓相比,操作逻辑,甚至功能界面都基本相似,但在流畅度上却比安卓强, ...

  7. 如何使用Bandicam录制1080P超清视频上传优酷?

    如果使用Bandicam录制1080P超清视频上传优酷? 很简单,打开Bandicam!然后:"录像"设置- 如图! 购买官方正版Bandicam 请联系我们: --------- ...

  8. 新科技新文娱:从天猫双11看优酷背后的产品技术升级

    9小时成交破千亿,全天交易额1682亿!天猫双11购物狂欢节再度创造历史,成就了一次前所未有的全球所有商业力量的全社会大协同,彰显出科技与大数据的强大驱动力. 在"买买买"之外,阿 ...

  9. 如何直接下载优酷视频?不用优酷下载器下载视频方法技巧

    转载原地址:http://www.jb51.net/softjc/135042.html 以下为转载内容: 可能有许多朋友平常喜欢在优酷土豆下载视频观看,通常都只有安装i酷加速器或者飞速土豆软件才可以 ...

最新文章

  1. 原创推荐!B站最强学习资源汇总(数据科学,机器学习,Python)
  2. python 函数的嵌套 和 作用域链
  3. 关于大型网站技术演进的思考(七)--存储的瓶颈(7)
  4. python—多进程之进程的创建(一)
  5. python 小波去噪,用Pywavelet去噪信号?
  6. Node.js -- Stream 使用小例 ( 流运用 :读取、写入、写出、拷贝)
  7. AlphaGo背后这项核心技术,后来怎么样了?
  8. win11升级不满足最低系统要求怎么办 windows11升级不满足最低系统要求的解决方法
  9. MySQL:Specified key was too long; max key length is 1000 bytes
  10. phpstorm配置ftp,自动更新代码
  11. 遗传算法c语言代码实验报告,遗传算法的c语言程序
  12. 【排队论 | 数学建模常用模型】
  13. 【web前端特效源码】使用HTML5+CSS3+JavaScript制作一个进度条动画效果~适合初学者~超简单~ |前端开发|IT软件
  14. 了解伽马(GAMMA、伽马值、光度、灰度系数)
  15. input 获取焦点的情况
  16. 手机兼容性测试——机型选择(从系统、屏幕、型号考虑)
  17. MP2459被完美替代内部集成有功率MOSFET管FS2459的60V0.5A降压IC
  18. 大剖析:中国数万亿家装市场,为何出不了一个30亿美金的Houzz?
  19. linux磁盘扩容:新增磁盘、原磁盘扩容、home/root分区扩容
  20. 为什么说BMC才是国产服务器的“命门”?

热门文章

  1. sql2005通用分页存储过程
  2. Mvc 4.0实现Response.Write()效果
  3. 千古奇闻!明朝就已成功试爆两万吨原子弹?
  4. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·007【uni-app和vue.js基础快速上手】
  5. discuz mysql 编码_Discuz!X 下如何使用 Tools 来转换数据库编码
  6. 【服务器】创建docker、运行jupyter相关命令
  7. 如何以源码安装mysql_CentOS以源码方式安装MySQL
  8. 公众号抢号_公众号调性是什么意思?公众号排版可以塑造公众号调性吗?
  9. pycharm使用技巧及最常用的几个快捷键
  10. java面试题常见的坑_java那些年踩过面试题的坑,你是否依旧记忆犹新!