作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Richard Forsythe's profile image

Richard Forsythe

Richard在开发领域拥有丰富的经验, product ownership, and QA engineering.

Previously At

Sage Group
Share

iOS内置了三个搜索点:Siri、Spotlight搜索和Safari搜索. Siri, iOS最具标志性的功能之一, 是大多数iPhone用户已经熟悉的东西吗. 但很多人都不知道Spotlight搜索——早在Siri出现之前,它就已经是iOS系统不可或缺的一部分了. 向下滑动主界面,可以进入聚光搜索, or new to iOS 9, 从个人主屏幕向右滑动. 这将在屏幕顶部显示一个搜索栏.

在iOS 8和更早的版本中,这个搜索工具的重点是搜索手机本身, 所以它的结果页面列出了你手机上的应用程序, as well as emails, messages, 以及苹果应用程序中的其他私人项目. 如果相关的话,它还会显示维基百科的定义. 最后,它还提供了一个额外的选项,可以通过Safari进行网络搜索.

In contrast to Spotlight Search, Safari 都是关于手机之外的世界吗. In iOS 8, 用户可以选择使用哪个搜索引擎为Safari搜索:谷歌, Yahoo, Bing, and DuckDuckGo. 当然,谷歌处理大部分Safari搜索请求. 不管选择什么搜索引擎, 预先填充的搜索词在Safari中显示, 可能与维基百科匹配.

In iOS 9聚光灯搜索比以前更突出,范围更广. 事实上,你首先看到的是基于你使用模式的“Siri建议”. For example, 如果你经常在下午使用Safari的话, Siri会在那个时候为你推荐.

And, 虽然它仍然是一个寻找“手机上的东西”的地方, 它正在成为“不在你手机上的东西”的直接门户。. 你已经可以通过苹果自己的搜索引擎看到附近的事物和从网络上获取的新闻标题, 其他基于网络的搜索结果也刚刚开始出现.

是的,苹果已经为iOS 9创建了一个网络搜索引擎,这是一个非常大的进步. Say hello to Applebot.

In a similar vein to Spotlight, 苹果对Safari的声明目标也是显示苹果搜索索引的结果和建议, 在提供使用谷歌(或其他选定的提供商)搜索网络的能力之前. As of iOS 9.1, Safari继续从用户选择的搜索提供商那里提供搜索结果,似乎落后于Spotlight搜索——也许是为了让苹果放慢推出其搜索功能的速度,并有更多的时间来调整其算法.

iOS 9的发布特别令人兴奋的是,它第一次提供了 iOS developers 挂钩到这些搜索功能并包含内容的能力 from within apps. 此外,谷歌还承诺,搜索最终将包含结果 not on the user’s phone. This is a huge step.

Let’s just put this into context. 谷歌的搜索引擎已经催生了一个围绕“SEO”的完整产业——围绕谷歌搜索优化你的资产的过程. When fully launched, 苹果的搜索引擎将占据大约50%的移动搜索市场, 哪一个占总搜索流量的50%(而且还在不断增长). 因此,Applebot很大,这意味着“苹果移动搜索优化”也会很大.

苹果手机搜索优化的努力将比常规的搜索引擎优化对手机用户的应用发现产生更大的影响.

欢迎来到新生的AMSO行业.

坏消息是,实现所有这些功能需要苹果的许多新技术以及对旧技术的改进, 这些元素的组合可能会令人困惑. 本系列的目标是介绍各个部分,并阐明如何实现它们. 让我们从一些基本的东西开始,并以此为基础.

为开发者揭开iOS 9 Spotlight搜索的神秘面纱

为了支持本系列,我创建了一个简单的应用程序供参考. The project can be found on GitHub. 随着本系列继续介绍搜索工具包的其他元素,还将对其进行更新.

基础:corespolight框架

This framework, completely new in iOS 9, 允许你将项目添加到iPhone的本地搜索索引中,供用户发现. For example, before iOS 9, 只有苹果官方应用程序中的内容, such as Calendar, 可以通过重点报道搜索找到吗. Now, 任何通过corespolight框架发布日历事件的应用程序都可以通过Spotlight搜索甚至Siri找到.

Note that the focus here is on personal information; you don’t want your personal calendar events being found by users on another phone! 苹果非常清楚,CoreSpotlight框架只与每个人手机上的私人索引交互. 不可能使用CoreSpotlight API来发布手机自身索引之外的内容.

这并不意味着corespolight不能用于索引已经公开的信息. 使用corespolight从云端提取信息并将其放入手机的搜索索引中当然是可能的. 这只是苹果公司的一个保证,如果个人和机密信息被corespolight索引, it will remain confidential.

该框架由两部分组成: CSSearchableItemAttributeSet 对象,该对象允许应用程序详细描述每个项目 CSSearchableItem 对象,该对象用于为项目提供唯一ID. 每个Spotlight条目都由一对这样的对象组成. 使用两个对象而不是一个对象的原因是 CSSearchableItemAttributeSet 对象用于另一种类型的搜索交互(稍后描述).

It’s pretty easy to do the basics.

对于那些引用示例代码的人来说,设置CoreSpotlight是在AppDelegate中完成的.

…
@import CoreSpotlight;
@import MobileCoreServices;	
…

新功能需要这两个模块.

为简单起见,在演示应用中使用 应用:didFinishLaunchingWithOptions: 方法用于调用一个专门的方法来设置corespolight:

if ([CSSearchableItemAttributeSet类])
    [self setUpCoreSpotlight];
//检查支持CoreSpotlight API的iOS版本

Moving down to the setUpCoreSpotlight 方法,我们通过创建 CSSearchableItemAttributeSet object:

CSSearchableItemAttributeSet * attributeSet = 
    [[CSSearchableItemAttributeSet alloc]
        NSString initWithItemContentType:(*) kUTTypeItem];

The Content Type 是重要的,因为它应该管理的一般方式,其中项目是由搜索算法处理. “假定”是关键字,因为这是苹果没有很好记录的领域. 有一个大的项目类型菜单可供选择(图像类型), video types, audio types, a contact type), 但要确定它对用户体验有什么影响(如果有的话),需要反复试验. 在搜索结果中,某些类型似乎比其他类型显示更多的文本内容. 它还可以影响缩略图图像是否与结果一起显示. kUTTypeItem是一个很好的起点.

现在更详细地描述这个对象:

attributeSet.displayName = @"圣诞颂歌";

attributeSet.title = @《欧博体育app下载》;
    //听起来类似于displayName,但不显示给用户
    
attributeSet.contentDescription = @"谁敢说"呸! “骗子”,在读完《欧博体育app下载》后? 查尔斯·狄更斯在1843年12月19日首次出版前仅六周就完成了这部中篇小说,但他关于一个名叫埃比尼泽·斯克鲁奇的老吝啬鬼的道德故事一直流传到今天,提醒着人们圣诞精神的重要性.";
    
attributeSet.关键词:《欧博体育app下载》、《欧博体育app下载》、《欧博体育app下载》;
    
UIImage *image = [UIImage imageNamed:@"CC-Cover"];    
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)];
attributeSet.thumbnailData = imageData;

有很多可能的属性,特定于媒体类型,如图像,视频等. 更多的信息可能更好, 但是需要反复试验来确定哪些信息被实际使用和/或显示在搜索结果中. At the time of writing, for example, 对于给定的索引项,似乎没有显示星级, 即使attributeSet包含星级数据.

大多数文本属性都包含在搜索查询中, 虽然title属性没有显示, the text can be found via search. 因此,并不完全清楚keywords属性与title属性有何根本不同.

有关更多信息,请参阅Apple文档: developer.apple.com

The final step is to package the CSSearchableItemAttributeSet with CSSearchableItem and register it with the index.

CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:@ " http://www ..notestream.com/streams/564159e4e5c24 notestream domainIdentifier: @.com" attributeSet:attributeSet]; 

Two new things here. The domainIdentifier 属性允许您将项目分组以进行批处理操作. For example, 日历应用程序中的@“meetingItem”和@“reminderItem”将允许你删除一种类型的所有Spotlight条目,同时留下另一种.

The uniqueIdentifier 房地产将扮演更重要的角色. First, 当用户点击corespolight索引中的一个项目(稍后讨论)时,它被传递回你的应用程序。. Second, 苹果公司对在使用搜索基础设施的其他元素时应该是什么样子给出了建议. 现在,我们将使用一个字符串,它实际上是唯一表示该项的URL. 从技术上讲,这个属性可以是任何字符串,只要它对项目是唯一的.

最后一步:将创建的项推入实际索引.

[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item1, item2, item3]
    completionHandler: ^(NSError * __nullable错误){
    if (!error)
        NSLog(@“搜索项目(s)日志索引.");
}]; 

A couple of points to make here:

  1. 该方法接受一个对象数组(如果有大量数据需要索引,还有其他方法可用于批处理)。.

  2. 重要的是要认识到,这种方法实际上并没有完成索引过程. 只有当搜索项已排队进行索引时,才调用完成处理程序. Use the CSSearchableIndexDelegate 处理索引过程本身由于某种原因失败的情况,你的应用程序需要处理这种情况.

祝贺您,您已经将项目添加到手机的corespolight搜索索引中!

How Search Works in iOS 9

Naturally, 苹果对自己的搜索算法守口如瓶, 因此,安装示例应用程序并使用关键字是值得的. For example, 很快我们就发现,苹果是在最大化呈现的结果,根据用户输入的不同字母给出截然不同的结果。

看起来,其原则是,被认为更合适的结果将在几个字母被打出来之后呈现. As the user types more letters, 这些早期的结果被丢弃,而其他的事情(最初估计不太可能)被呈现出来.

More generally, 关于如何在他们的算法下提高排名,苹果公司只说了几句话. 这个页面包含苹果的推荐: Enhance Your Search Results

从苹果的文档中得到的一个关键结论是,当应用程序使用多种搜索技术对内容进行索引时,排名会得到提高. 我们将在下一篇文章中深入研究其中的另一种技术. Meanwhile, 我们仍然需要实现代码来处理用户单击搜索结果时的场景.

When the User Clicks

我们已经创建了用潜在搜索结果填充索引的代码, 但是当用户点击结果时发生了什么呢? 答案是corespolight借用了 应用范围:continueUserActivity: restorationHandler: 方法从UIApplicationDelegate协议. 这最初是在iOS 8中引入的,用于允许用户活动从一个设备传递到另一个设备的切换机制.g. 用户在iWatch上看到一个web URL, 在iPhone Safari浏览器上使用切换来选择它, 并最终在他们的Mac上查看.)

第一个挑战是确定该方法是由于Handoff活动还是从Spotlight Search调用的. activity参数的activityType属性会告诉你, 但如果代码可以在iOS 8上运行, 在这种情况下,你需要避免撞车.

下面是一些简单代码的样子:

- (BOOL)应用程序:(UIApplication *)应用程序continueUserActivity:(NSUserActivity *)活动restorationHandler:(void (^)(NSArray *))restorationHandler
{
    
    NSString * valueCSSearchableItemActionType;
    BOOL wasHandled = NO;
   
    if ([CSSearchableItemAttributeSet类]) //iOS 9
    {     
        valueCSSearchableItemActionType = CSSearchableItemActionType;
        
    } else { 
        // iOS 8 -此方法在iOS 8中引入,因此iOS 7不可能出现这种情况
        valueCSSearchableItemActionType = @"不支持";
    }
        
    if ([activity.activityType =: valueCSSearchableItemActionType])
    {	
        //通过CoreSpotlight调用,我们可以假设iOS 9从现在开始…

        NSString * activityIdentifier = [activity.用户信息valueForKey CSSearchableItemActivityIdentifier):;

        wasHandled = YES;
        NSLog(@“持续的用户活动%@”,activityIdentifier);
        
    } else {
        
        //应用程序通过切换协议启动
        //or with a Universal Link
    }
    
    return wasHandled;
}

Note the line of code:

NSString * activityIdentifier = [activity.用户信息valueForKey CSSearchableItemActivityIdentifier):;

提取放在聚光灯索引中的唯一标识符 CSSearchableItem object was created. 当然,你的应用应该使用这个唯一标识符向用户展示他们从搜索索引中选择的内容. 为了简单起见,我们只NSLog唯一标识符.

Recap

到目前为止,我们只研究了iOS 9搜索功能的一部分. 我们已经运行了加载手机Spotlight搜索索引所需的核心功能,其中包含用户可能会发现有用的东西:文档, calendar items, contacts and so on. 当用户搜索某些东西时, 看到应用程序的结果并点击它, 该应用程序将能够处理请求并为用户显示适当的项目.

我们还没有讨论的是与苹果正在建立的公开指数相关的技术. 这个索引的目的是让用户在你的应用程序中找到内容,即使它没有安装在他们的手机上. 我们将在下一篇文章中解决这个问题.

聘请Toptal这方面的专家.
Hire Now
Richard Forsythe's profile image
Richard Forsythe

Located in Lake Forest, CA, United States

Member since November 11, 2015

About the author

Richard在开发领域拥有丰富的经验, product ownership, and QA engineering.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

Sage Group

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.