在iOS9之前,您只能在Spotlight中搜索应用名称。借助iOS9中新发布的搜索API,Apple现在允许开发人员自定义可在其应用程序中搜索的内容、搜索结果在Spotlight中的显示方式以及用户单击搜索结果时的事件。3搜索APINSUserActivityNSUserActivityAPI是在iOS8引入新特性Handoff时引入的,但在iOS9中Spotlight也可以搜索活动。您现在可以向活动提供元数据,指示可以找到该活动。在实际使用中,它是一个历史堆栈,类似于您平时的网页浏览。用户可以从Spotlight快速打开最近使用的活动。WebMarkupWebMarkup的机制是应用程序可以将内容镜像到网站,然后Spotlight会索引里面的内容。即使用户的设备上没有安装该应用程序,搜索结果也可以显示在Spotlight中。Apple的爬虫将继续在Internet上爬行,寻找网站上的特定标记。搜索结果将同时出现在Safari和Spotlight中。即使用户没有安装app,也能找到搜索结果,所以这个功能很重要,可以给你带来很多在潜在用户面前的曝光机会。您向搜索API公开的应用程序中的深层链接将存储在Apple的云索引中。要了解有关WebMarkup的更多信息,您可以查看Apple的官方文档UseWebMarkuptoMakeAppContentSearchable。CoreSpotlightCoreSpotlight是iOS9的一个新框架,允许您索引应用程序中的任何内容。前面提到的NSUserActivity可以用来保存用户历史信息,这个新的API可以索引任何数据。它为您在用户设备上访问CoreSpotlight索引提供了必要的桥梁。使用CoreSpotlightAPINSUserActivity和WebMarkupAPI相对容易使用,而CoreSpotlight稍微复杂一些。为了演示如何使用新的CoreSpotlightAPI,让我们制作一个简单的应用程序。它的功能是显示好友列表,当点击好友的名字时,会显示头像。你可以在GitHub上下载源代码,然后一步一步来。应用程序截图应用程序中有一个简单的故事板,其中包含一个显示简单好友列表的FriendTableViewController;和一个显示每个朋友详细信息的FriendViewController。故事板中所有好友的信息都存储在Datasource类中。我们使用这个类来创建一个保存好友信息的模型。另外,保存好友到CoreSpotlight索引的逻辑也写在这个类中。首先,我们重写Datasource类的init()方法,并在该方法中创建并保存一个Person数组。可能数据一般应该从数据库、服务器接口等读取。为了演示,我们简单的写一些假数据。overrideinit(){letbecky=Person()becky.name="Becky"becky.id="1"becky.image=UIImage(named:"becky")!...people=[becky,ben,jane,pete,在ray,tom]}people数组存储数据后,数据源就准备好了!这里的数据已经准备好了,FriendTableViewController可以创建一个Datasource的实例,当tableview要显示单元格的时候用到。letdatasource=Datasource()在cellForRowAtIndexPath方法中,显示单元格内容的代码如下:letperson=datasource.people[indexPath.row]cell?.textLabel?.text=person.name#p#将人物数据保存到CoreSpotlight现在有了假数据,我们可以使用iOS9的新API将其存储在CoreSpotlight中。回到Datasource类,我们在这个类中定义了一个方法savePeopleToIndex。这个方法可以在FriendTableViewController的接口加载完成后调用。在这个方法中,我们循环遍历people数组中的每个人,为每个人创建一个CSSearchableItem,并将其存储在一个临时数组searchableItems中。letattributeSet=CSSearchableItemAttributeSet(itemContentType:"image"asString)attributeSet.title=person.nameattributeSet.contentDescription="Thisisanentryallabouttheinterestingpersoncalled(person.name)"attributeSet.thumbnailData=UIImagePNGRepresentation(person.image)queentid.mainierIdif(:uni:"com.ios9daybyday.SearchAPIs.people",attributeSet:attributeSet)searchableItems.append(item)最后一步是在默认的CSSearchableIndex上调用indexSearchableItems。这一步实际上是将这些项目保存在CoreSpotlight中,之后用户可以搜索这些数据,这些数据会出现在搜索结果中。CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems,completionHandler:{error->Voidiniferror!=nil{print(error?.localizedDescription)}})完成了!运行应用程序,数据将实时添加到存储中;在spotlight里搜索,就能找到你的朋友啦~搜索结果响应用户点击现在用户可以在Spotlight里看到你的搜索结果了,希望他们点击上去!但如果他们这样做会怎样?截至目前,点击搜索结果只会将您带到您的应用程序。如果你想显示用户刚刚点击的朋友,你必须多写一些代码。我们可以在应用程序的AppDelegate的continueUserActivityUIApplicationDelegate方法中指定应用程序从搜索结果中打开后的行为。这是整个方法的代码:funcapplication(application:UIApplication,continueUserActivityuserActivity:NSUserActivity,restorationHandler:([AnyObject]?)->Void)->Bool{//FindtheIDfromtheuserinfoletfriendID=userActivity.userInfo?["kCSSearchableItemActivityIdentifier"]as!String//FindtheroottableviewcontrollerandmakeitshowthefriendwiththisIDletnavigationController=(window?.rootViewControlleras!UINavigationController)navigationController.popToRootViewControllerAnimated(false)letfriendTableViewController=navigationController.viewControllers.firstas!FriendTableViewControllerfriendTableViewController.showFriend(friendID)returntrue}如代码所示,之前我们用indexSearchableItems方法存在CoreSpotlight索引里的信息,现在可以通过userActivity.userInfo获取。我们在这里唯一感兴趣的是朋友的ID,我们将其存储在索引项的kCSSearchableItemActivityIdentifier中。我们从userInfo字典中提取出ID之后,接下来就是获取app的navigationcontroller,弹出到首页(不带动画,让用户看不到弹出的过程),然后调用showFriend方法friendTableViewController的。这个方法我就不细说了,简单来说就是根据ID从datasource中找到对应的friend,然后推入一个新的viewcontroller。今天就这样吧!现在,当用户在Spotlight中点击好友时,他们将看到以下屏幕:点击搜索结果正如您在屏幕截图中看到的那样,在应用程序的左上角有一个“返回搜索”按钮。点击这个按钮会直接返回到搜索结果页面,也就是刚才点击好友名字的页面。用户还可以点击标准后退按钮并在应用程序中导航。Demo总结在上面的Demo中,我们展示了将应用数据与CoreSpotlight索引集成是多么容易,引导用户打开应用是多么强大,以及它对用户搜索特定内容的帮助有多大。但是,我们没有提到如何从索引中删除数据。这个还是很重要的,要勤于更新索引数据。有关如何从CoreSpotlight中删除旧数据的更多信息,请参阅deleteSearchableItemsWithIdentifiers、deleteSearchableItemsWithDomainIdentifiers和deleteAllSearchableItemsWithCompletionHandler方法。纪律的重要性虽然看起来Spotlight和Safari索引的应用程序内容越多越好,但在往里面倒水之前要三思。在iOS生态系统中保持完整性,不仅会让用户更舒服,苹果也在观望。Apple花了很多心思来确保搜索结果真正相关,他们跟踪搜索结果的点击率,垃圾邮件可能导致被移到搜索结果的末尾。了解更多要了解有关新搜索API的更多信息,我建议您查看WWDC会议709,介绍搜索API。您可能还对NSUserActivity类参考和CoreSpotlight文档感兴趣。别忘了,如果你想尝试本文描述的演示,你可以去GitHub上查看源代码。
