SearchAPI是什么
iOS 9.0 系统以后,下拉屏幕或者向右滑到最后会显示"spotlight"页面(不支持以下可以升级到iOS9的设备:iPhone 4S,iPad 2,iPad第三代,iPad mini, iPod touch第5代)
在搜索栏中搜索关键词,会显示不同app的内容,如图一
点击『豆瓣』一栏里的第一行,直接跳入了『豆瓣』app,显示了『荒野猎人』的页面
这就是SearchAPI的一个用法。
官方文档App Search Programming Guide中的介绍是
Search in iOS 9 gives people great ways to access information inside of your app, even when it isn’t installed. When you make your content searchable, users can access activities and content deep within your app through Spotlight and Safari search results, Handoff, Siri Suggestions, and Reminders. Making your content searchable helps you enhance the user experience of your app and improve its discoverability.
iOS 9 的搜索功能为人们获取app中的信息提供了极大的便利,即便是在该app并未安装的情况下。 当你的app中的内容标记为可搜索时,用户可以通过Spotlight,Safari,Handoff,Siri Suggestion ,Reminders来获取到这些页面和内容。让你的app的内容可以被搜索到,这能够帮助用户发现你的app,并且提升用户体验。
App search is easy for you to adopt and customize. You don’t need any prior experience with implementing search, and you control what content gets indexed, which information to show in search results, and where the user goes after tapping a result related to your content.
App search 功能很容易使用和定制。你自己控制哪些内容是被标记为可搜索的,哪些信息是展示在搜索结果中(spotlight,safari等),用户点击了你的搜索结果之后页面跳去哪里,并不需要在此之前有过implementing search的经验。
iOS 9 中隐私性是一个基本的特征。为了在保护用户隐私数据的情况下给用户最好的搜索体验,这里有两种索引(index)方式来存储可被搜索的内容。你可以使用各种搜索相关APIs来对每个item指定合适的索引(index),因此,明白每种索引(index)是如何工作的就至关重要。
iOS 9 provides the following indexes:
A private on-device index. Each device contains a private index whose information is never shared with Apple or synced between devices. When you make an item available in a user’s on-device index, only that user can view the item in search results.
Apple’s server-side index. The server-side index stores only publicly available data that you’ve marked appropriately on your website
iOS 9 提供了两种索引方式:
- 私有的设备侧索引。每个设备包含私有的索引,被其索引的信息永远不会跟Apple共享或者在设备之间同步。当一个条目被标记为用户侧索引,只有该设备的用户才能在搜索结果中看到该类目。
- Apple 服务器侧索引。服务器侧索引只存储,你的网站上的,已经恰当的标记为公开可见的数据。
iOS 9 提供了一些APIs:
- NSUserActivity类中新增了方法和属性。这些可以帮助你索引用户在app的活动,比如visiting a navigtion point ,创建和查看内容。
- Core Spotlight framework。它提供的APIs能把app特定内容添加到用户侧索引,并且开启跳入到你的app的deep links。(所谓deep link 指的是点击spotlight或者safari的搜索结果,跳进你的app中的指定页面)
- Web markup。这个能把相关的web 内容可搜索化,帮助你丰富用户的搜索体验。
如何选择合适的APIs?
官方文档给出了下面的信息。
It’s recommended that all apps use NSUserActivity and that they support Handoff. Using the search-related properties of NSUserActivity is the best way to show users the information they care about and to improve the ranking of your search results. As users perform activities in your app, you use NSUserActivity to add the item to the on-device index. By default, an item represented by an NSUserActivity object is private, which means that it is added to the on-device index. If your content includes activities that all users can view, you identify them as eligible for public indexing. Learn more about using NSUserActivity in Index Activities and Navigation Points.
If your app handles persistent user data, such as documents, photos, and other types of content created by or on behalf of users, use the Core Spotlight APIs to index the content. Unlike NSUserActivity, Core Spotlight does not require users to visit the content in order to index it. In addition, you can use CoreSpotlight APIs to index content at any point, such as when the app loads. Note that Core Spotlight helps you make items searchable in the private on-device index; you don’t use Core Spotlight APIs to make items publicly searchable. Learn more about using Core Spotlight APIs in Index App Content.
If your app hosts some or all of its content on a website, use web markup to let Apple’s web crawler (calledApplebot) index your content in Apple’s server-side index and make it available to all iOS users in Spotlight and Safari search results. Learn more about using web markup to make your web content searchable in Mark Up Web Content. Note that search results generated by web markup are shown in countries that are supported by Spotlight Suggestions.
苹果推荐所有app 都使用NSUserActivity 来提供Handoff功能。使用NSUserActivity中搜索相关的属性,是展示用户关心的信息,提升在搜索结果中的排名的最好的方式。用户在你的app中操作的时候,你使用NSUserActivity把当前活动增加到用户侧索引中。默认情况下,使用NSUserActivity抽象的条目是私有的,这意味着它被存储在用户侧索引中。如果你的内容中包括所有用户都可见的活动,你应该把这些内容声明为公开。点击Index Activities and Navigation Points查看更过关于如何使用NSUserActivity的信息。
如果你的app操作了持久化的信息,比如文档,图片,其他类型的(被用户或者为了用户创建的)内容,那你应该使用Core Spotlight APIs来索引它们。不同于NSUserActivity,Core Spotlight并不要求先让用户访问内容才能索引这些。另外,你可以使用CoreSpotlight APIs在任何节点索引数据,比如在app加载的时候。值得注意的是,使用Core Spotlight标记的数据都是用户侧的,你并不能把item标记为公开可搜索的。点击Index App Content查看更多关于使用Core Spotlight APIs的信息。
如果你的app在网站上托管部分或者全部数据,使用web markup 可以让Apple的网页爬虫(叫做Applebot)把内容索引到Apple服务器侧,这使得这些内容在所有iOS 用户的Spotlight 和Safari搜索结果中都是可见的。请注意:使用web markup生成的搜索结果会展示在Spotlight Suggestions支持的国家。
使用NSUserActivity的索引声明为公开内容有什么作用?我在官方文档里找到这样一段话
In iOS 9, marking a public item as eligible for public indexing also adds it to the on-device index and confers an additional advantage: When you use web markup to make your related website content searchable, user engagement with publicly eligible search results from your app can help improve the ranking of your website’s content. When a user taps a searchable activity or state in Spotlight search results, you use NSUserActivity APIs to continue the activity and return the user to the relevant area in your app.
在iOS 9中,把一条公共类目标记为eligibleForPublicIndexing也是存储到on-device index,这给予了更多的功能:当你使用web markup技术把你的相关网页内容可搜索化时,你的app的公开搜索结果的用户参与度,可以帮助你提升你的网页内容的排名。当用户点击了spotlight 搜索结果中的活动或者状态时,使用NSUserActivity APIs 帮助用户继续之前的活动,返回到app中相关页面。
综合上文,使用NSUserActivity把内容标记为公开,可以让安装了app的其它用户搜索到相关信息。举个例子,淘宝电影app。A用户访问了『美人鱼』电影页面,这个时候app内部把该(由美人鱼电影相关信息封装而成)类目标记为公开;然后B用户也执行此操作;C用户,D用户...。当产生了许多个(未知,没公布)相同标记之后(每个用户访问美人鱼页面在其设备上生成一个标记),没有访问过该页面的X用户Y用户Z用户在spotlight中搜索『美人鱼』,也会出现该搜索结果(需要用户安装淘宝电影app)。
隐私
这三种APIs ,跟上文说的两种索引方式是对应的。使用NSUserActivity和Core Spotlight APIs创建的索引都是 on-device index.
使用web markup技术是存储在server-side
As the user uses your app, you create activity objects associated with various navigation points and app states. Each item is added to the on-device index by default. In iOS 9, marking a public item as eligible for public indexing also adds it to the on-device index.
The Core Spotlight framework provides ways to index the content within your app and manage the private on-device index.The items you index using Core Spotlight APIs are not added to Apple’s server-side index or synced between devices.
Because items indexed by Applebot are already public, they are stored on Apple’s server-side index.
辅助功能
除了使用NSUserActivity 和 Core Spotlight的APIs,增加web markup之外,你还应该使用三个关键技术来给用户最好的体验。
Univeral links。 在iOS 9 之后,使用universal links技术,用standard HTTP or HTTPS links取代custom URL schemes。Universal links对所有用户有有效:如果用户安装了你的app,link会把他们引入你的app;如果用户没有安装你的app,lin 会在Safari打开你的网站。点击Support Universal Links了解如何使用universal links。
Smart App Banners。当用户在Safari中访问你的网页,Smart App Banner 可以让用户启动你的app(如果有安装)或者有机会下载你的app(如果未安装)。点击Promoting Apps with Smart App Banners了解更多关于Smart App Banners 的信息。
Handoff。Handoff 允许用户从一个设备切换到另一个设备时继续之前的活动。例如,当在Mac浏览一个网页时,在你的iPad上,会直接进入你的原生app中。在iOS 9 中,Handoff包括了对app search的特殊支持。点击Handoff Programming Guide了解更多关于Handoff 的信息。
关于搜索结果的排名
为了给用户最好的体验,系统会估计用户使用Spotlight或者Safari搜索跳入app的频次。正因为如此,那些用户觉得没什么用的搜索结果会很快的被标记出来,最终不会再搜索结果中展示。
iOS 会根据下面的信息来决定搜索结果展示的顺序:
- 用户通过搜索访问app内容的频次(only NSUserActivity)
- 用户通过搜索访问app的数量
- 使用web markup标记的网页的访问量和有效结构化的数据量。
总得来说,你可以通过以下的事情来提供良好的搜索结果以此鼓励用户使用你的app:
- app内提供优质内容
- 使用上文提到的搜索APIs来提升搜索结果与你的app的相关姓
- 尽可能的只把用户最喜欢的数据供搜索使用
- 必要的情况下通过移除和更新来保持索引的时效性
- 提供切实丰富的搜索信息来引导用户点击(搜索结果)
- 尽可能的减少,用户点击搜索结果到跳入app展示内容,这个过程消耗的时间
点击 Combine APIs to Increase Coverage andImprove the Ranking of Your Results来了解更多关于提升用户搜索体验的信息
实战,对几个app的分析
淘宝电影
对照一台没有安装过淘宝电影app 的iOS 9.2系统的iPhone6Plus,实验组也是iPhone6Plus正常使用淘宝电影,访问频次2周一次。
试验过程略
结果:
1.初次安装未打开的情况下搜索当前上映电影并无结果。
2.启动过app,停留在列表页,成功收到数据后再次搜索,可以搜索出当前上映电影,即便该并未进入过电影详情;断网后依然可搜索。
3.搜索出的结果,断网前后并无区别。
4.半年前的电影,两台设备都无法搜索出,但是在淘宝电影app内搜索出该电影(无论是在app搜索列表或者详情页),spotlight就可以搜索到。
分析:淘宝电影app会在首页或者之前,将最近数据索引。用户app内搜索的结果和访问记录也会被索引。使用的API应该是NSUserActivity,但是是否将属性设置为公开,并无结论。
知乎
分析:知乎也是会索引首页数据和用户访问记录。但是经过断网测试,首页数据的缓存可能是随用户滑动进行,并不是一次性。
百词斩
分析:百词斩的app我用的不多,但是新下载的app,断网后打开app。然后搜索常用单词,都可以搜索到。我怀疑百词斩是直接使用core spotlight 索引了成千上万个单词和常用短语。
关于Search API的一些使用场景
1.展示对应新闻 - 今日头条
2.展示问答帖子 - 知乎
3.展示电影 - 淘宝电影,豆瓣
4.展示电影院 - 淘宝电影
5.展示单词 - 百词斩
6.展示药品 - 用药助手
7.展示地标 - 百度地图
具体如何使用Search APIs,就要看需求而定了。
疑惑
- NSUserActivity 设置为public的情况,在测试(断网前后对比测试)中并未发现具体例子。可能是测试量级较少。
- 索引数据究竟最多能索引多少?这个我不知道。但是官网上有这样一句话
Core Spotlight APIs work best when you have no more than a few thousand items.
看样子,至少几千个还是运行的妥妥的。所以,看需求就放心的使用吧。