如何使用iOS 9的Core Spotlight框架

486 查看

iOS每一次版本的更新,都会给全球的开发工作者带来新的“知识点”和对现有技术进行的改进。显然,iOS的最新版本iOS 9不仅延续了这一传统,还公布了新的框架和API,开发者可使用新增的框架和API让自己的应用表现的更出色。其中之一就是Core Spotlight框架,它包含了一些优秀的API,有待开发者深入探究。

Core Spotlight (CS) 框架是Search API的一部分,它增加了开发者的应用的曝光率,使用户更容易发现和访问APP,但是这些API在iOS9之前的版本中是不可用的。这些Search API拉近了用户和app的距离,用户可以通过这种新的方法迅速的找到app,而app也可以迅速的对用户的操作做出反应。除了Core Spotlight之外,iOS 9还包含以下新的search功能(仅供参考):

1、NSUserActivity这个类中新的方法和属性(该类负责存储app关闭时的状态,以便之后恢复app的状态。)

2、在设备上使用web标记,以便搜索到web中的内容。

3、能通过web内容中的链接直接启动应用程序的通用链接。

本文不会对以上三点做详细介绍,只详细讲解Core Spotlight框架。在讲解之前,先了解以下Core Spotlight到底是什么?

32.png

如上图所示:Core Spotling框架可以让用户通过Spotlight搜索到app中的数据,并将app相关内容和系统搜索返回的结果一起展示出来。也就是说用户可以与应用程序的其他相关结果进行交互,当点击其中一项搜索结果时并不仅仅自动启动APP,开发者也可以让用户选择与数据最相关的内容。

从开发者的角度来说,集成Core Spotlight框架并使用它提供的API并不是一件难事。学过这教程之后,你将会发现仅仅需要几行代码就可以实现这个功能。集成的核心问题在于开发者必须把APP的数据以特定的格式加入到iOS系统的索引中。

由于本教程专注于Core Spotlight框架的使用,所以我不打算深入研究这个框架。

关于Demo App

和往常一样,我们打算通过一个示例应用来研究探索Spotlight的细节。在这个demo中,我们将往应用程序中写入一组数据,并且这些数据都是可以通过真机或模拟器的Spotlight功能被搜索到的。虽然实现Spotlight功能搜索是重点,但是还是有必要介绍一下关于demo app 的更多细节。

我们的示例应用要达到的效果是展示一些电影及其相关的信息,例如电影概要、导演、明星以及影评等级等。所有的电影数据将会放在列表中展示,并且当点击到对应的行时,所选择的电影会在一个新的视图控制器中展示出电影的详情。这些功能和数据作为我们挖掘Spotlight的API而言已经够用了。我们的数据来源是International Movie Database (IMDB),我们从这个网站获得数据示例。

通过看下面的动画示例,你可以先看一下演示程序的效果:

t46_1_app_working-compressor.gif

在本教程中,我们有两个目的:最重要的是让这个应用内的所有电影方面的数据都可以被Spotlight搜索到。当用户通过关键字搜索时,应用程序内关于电影的数据将会展现给用户。设置这些关键字是我们接下来工作的一部分,我们必须重新定义它们,使之符合规则。

点击搜索结果会打开应用程序,之后我们要实现第二个目标。如果我们没有做任何的处理,那么将会加载包含有电影数据列表的默认视图控制器展示给用户。然而,假如我们考虑到用户体验的话,这么处理并不是很好。好的方案是,我们的APP应该展示Spotlight选中的电影的详情。简言之,我们不仅要让应用程序内的电影数据能够通过Spotlight被搜索到,而且还要在用户点击搜索结果时,展示关联的电影详情页。接下来的示例动画会讲解的更清楚:

t46_2_final_sample-compressor.gif

为了节约时间,你可以在这里下载工程,然后开始我们的工作。在工程里面你会发现如下所示的内容:

  • 界面部分的组件已经搭建完成,并且包含所有必要的IBOutlet属性。
  • 最小化的列表视图。
  • 所有的电影数据都存放在以plist为后缀的文件中。此外图片文件是和电影一一对应的(一共有5部)。

假使你想知道预先准备的文件中包含了哪些对应电影的数据,那么你可以通过这个截图示例看到所有包含的内容。

t46_3_movie_plist_sample.png

先看一下Core Spotlight API的具体信息,我们会处理下面两个任务:

1、在列表中加载和展示电影数据。

2、在选中电影数据列表的某一行时会跳转到对应的电影详情界面。

启动项目没有实现上边的内容,尽管那样么做会让你们快速进到我们的话题,原因很简单:我很确信通过演示应用程序的核心功能和数据样本,你会很容易地了解到将要被Spotlight搜索到的具体数据。但是别担心,因为所有准备工作花费的时间很少,并且很快就可完成。

加载和展示示例数据

假如此时你已经下载好了起始工程,并且已经看过了电影数据属性列表,那么就让我们开始Coding吧。在MoviesData.plist这个文件夹下,你可以看到一共有5条数据,这些数据是从IMDB网站上随机选取的他们对应5个电影示例。我们第一步是从plist文件中加载数据到一个数组中,然后在列表中展示他们。

废话少说,直接上代码。打开ViewController.swift这个文件,并且在这个类声明属性的地方这么写:

所有的电影模型数据都会被加载到moviesInfo可变数组中,单个电影模型的数据将会以键值对的方式保存在字典中,并且他们和文件中的属性列表相匹配。

现在让我们编写一个加载数据的自定义函数。接下来你会看到,我们只是确保属性列表文件是否存在,如果存在,我们就初始化数组的文件内容:

接下来我们需要在viewDidLoad()函数调用loadMoviesInfo()函数。只是为了确保你在调用configureTableView()函数前正确调用此函数,下面展示的是代码片段:

要注意的是,我们只需把文件内容加载到viewDidLoad()函数,而不是为了创建上述的loadMoviesInfo()函数,但是作为喜欢代码整洁的人,即便是这么小的事情,都会选择更好的方式来实现。

应用程序每次启动时都会加载这些电影数据,我们可以继续修改当前视图列表,让它显示电影信息。需要处理的只有这么多:根据电影数据信息定义列表的行数,然后在表视图的单元格中展示正确的电影数据。

从列表视图的行数开始,显然列表视图的行数等于电影的数目。然而,我们不应忘记,要确保列表视图中有电影数据展示出来,否则当文件内容不被加载到数组中时就会造成应用程序的崩溃。

最后,让我们展示电影数据。为了达到我们需要的目标,在开始准备的工程中你可以找到UITableViewCell的子类MovieSummaryCell,和代表一个电影单元格的.xib文件:

33.png

用这样的一个单元格来展示每个电影的图片、标题、部分的描述信息和电影评级。所有UI控件已经连接到IBOutlet属性,并且可以在MovieSummaryCell.swift这个文件找到对应属性的名称:

上面的名字代表各个属性的用途,现在我们已经能够看到它们,我们通过它们来展示电影的相关细节。回到ViewController.swift文件,根据下面的代码片段更新表视图的函数: