嘿Siri:在iOS上与Anghami交谈

自2011年推出以来,Siri一直在稳步学习越来越多的技能。 每年,Apple都会对Siri进行更改,以允许开发人员使用更多功能,并且WWDC 2018看到了一些最令人兴奋的更新。

在WDC 2018之前,要与Siri集成,开发人员必须选择他们要提出的请求类型(称为意图),并且只有少数意图类型可供选择。 如果您的应用不属于这些类别之一,那么就不可能与Siri集成。 但是,在WWDC上,Apple向SiriKit引入了两个新功能,使Anghami可以集成到Siri中:媒体意图和自定义意图。

1.媒体意图

媒体意图提供了一种方便的方法,可将与媒体相关的操作添加到Siri。 他们的工作方式很简单。 首先,创建一个INMediaItem对象,该对象由一些参数(包括标识符,标题,类型和插图)进行自定义。

 让容器= INMediaItem(标识符:标识符,标题:标题,类型:类型,艺术品:图片) 

就我们在​​Anghami的情况而言,类型可以是从播放列表,艺术家到歌曲的任何类型,并且标识符将是项目的唯一ID。

完成之后,将创建一个INPlayMediaIntent对象,这是我们想要提供给Siri的实际意图。

  let intent = INPlayMediaIntent(mediaItems:nil,mediaContainer:mediaContainer,playShuffled:shuffled,playbackRepeatMode:.all,resumePlayback:nil) 

最后,将意图本身建议给Siri,然后Apple提供一个UI,允许用户向该操作分配任何自定义短语。

用户调用操作后,将在我们的应用程序委托中调用以下函数:

  -(void)应用程序:(UIApplication *)应用程序handleIntent:(INIntent *)意图完成处理器:(void(^)(INIntentResponse * _Nonnull))completionHandler; 

在这里进行检查,以查看该意图是否为INMediaIntent,是否从对象中检索了mediaItem,然后我们可以轻松地检索与该mediaItem相关的音乐对象(播放列表,艺术家,歌曲等)并进行播放。

最棒的是,这一切都是在后台发生的,因此用户无需解锁手机即可执行操作。 他们只是告诉Siri他们想要什么并且完成了。

2.自定义意图

媒体意图非常适合播放音乐,但是如果我们想对Siri进行更多处理,该怎么办? 在Anghami,我们还希望简化操作,包括喜欢歌曲,下载歌曲,检查歌曲的歌词,调用搜索等。这就是自定义意图的体现。

要创建自定义意图,首先应定义意图。 这是在意图定义文件中完成的(自然)。 创建一个新的自定义意图,然后必须定义一些参数。

类别参数具有“执行”,“运行”,“购买”等选项。 这用于帮助Siri在用户运行时知道如何谈论此操作。 然后定义一些更明显的参数,例如标题和描述。 最后,可以将参数添加到自定义意图。 这些将在创建意图时提供给Siri。

就像媒体意图一样,将创建一个意图对象,然后将其提供给Siri。 这很容易,因为在定义了意图之后,Apple会自动生成与新的自定义意图相关的类对象。

自定义意图的缺点在于,它们只能以两种方式运行,既可以在应用程序的前台运行,也可以在单独目标的后台运行。 这就是说,如果我们希望在不打开Anghami的情况下工作,那么我们必须这样做,同时又不能访问我们在Anghami主应用程序目标中拥有的许多有用的类和文件。

一种简单的解决方案是仅使自定义意图打开Anghami应用程序。 对用户而言,这只是一步而已,但是当我们知道一点点额外的工作可以消除这一步时,这样做是错误的。

因此,我们成功了。 我们的主要问题是我们想与应用通信,希望对当前播放的歌曲执行此特定操作。 不管是下载当前歌曲,喜欢它还是播放更多类似的歌曲都没有关系。 如果我们让应用程序确定了我们希望现在发生的事情,那么困难的部分就完成了。

处理方式是在共享容器的帮助下进行的。 共享容器基本上是一个可以存储文件/数据的存储桶,可以在主应用程序及其所有扩展(包括Intents扩展)之间共享。 因此,我们有一种与应用程序进行数据通信的方法。

有助于解决问题的另一点是,如果用户想要对当前歌曲执行操作,则音乐可能正在通过Anghami播放,这意味着我们的应用程序已经在后台运行。

因此,我们要做的就是简单地将当前歌曲的ID写入共享文件,使其始终处于更新状态,并在调用Intent时,根据所调用操作的类型将同一ID写入不同的文件(下载,例如,像这样玩,等等。 然后,该应用程序会不断检查这些文件,并且如果其中一个文件中写入了新的ID,则该应用程序将确保该ID与当前播放的歌曲一致,然后对该歌曲进行操作。 这不是理想的解决方案,但是鉴于约束和我们对Siri意图的愿景,这是我们能做的最好的事情。

额外的位

值得一提的另一件事是,我们如何完全控制Siri页面中显示的内容。 构建了一个系统,该系统允许我们的API发送字典的JSON数组,每个字典描述一个特定的Siri意图。 这将允许每个用户自定义我们应显示的Siri意图。

例如,如果我们的一个用户投入大量资金购买LCD音效系统频段,那么我们可以建议仅针对该用户执行“播放LCD音效系统”操作。 这些小而重要的额外步骤使我们对Siri的实施具有真正的照顾感。

结论

致力于Siri Intents是一个有趣的挑战。 苹果公司如何实现它们有很多让人喜欢的地方,但是还有很多需要实现的地方。 如果可以添加一件事,那就是自定义意图可以在后台在我们的应用程序中运行代码的能力。 这将使许多任务变得更加简单,考虑到开发人员在具备这种能力的情况下将能够创建的内容令人兴奋。

但是就目前而言,我们为能够为用户提供什么而感到自豪,而不受所有限制。 和往常一样,我们对接下来将要提供的东西感到很困惑。