版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.09.19 |
前言
iOS系统有自己的搜索,大家试过的都知道,这个搜索速度非常之快,可以很快的在网页、appleStor、地图以及其他App中的内容,接下来就让我们一起来看一下这个搜索。感兴趣的看下面几篇文章。
1. App搜索编程指南(一) —— 搜索基本之搜索推动用户参与(一)
2. App搜索编程指南(二) —— 搜索基本之示例实现(一)
3. App搜索编程指南(三) —— 让项目可索引之索引活动和导航点(一)
Index App Content - 索引应用内容
Core Spotlight
框架提供了对应用程序内容进行索引并管理私有设备上索引的方法。 Core Spotlight最适合索引用户特定的内容,例如朋友,标记为收藏的项目,购买的项目等。 使用Core Spotlight API使项目可搜索时,您可以轻松地在Spotlight搜索结果中查找其内容。
注意:使用Core Spotlight API索引的项目不会添加到Apple的服务器端索引或在设备之间同步。 要了解有关为所有iOS用户提供适当项目的方法的更多信息,请参阅 Mark Up Web Content。当您拥有不超过几千个项目时,
Core Spotlight API
最有效。
在较高的层次上,Core Spotlight API
可帮助您提供项目的全面描述并将其添加到设备上索引。此外,CoreSpotlight API可以随时支持索引项,例如加载应用程序时。
当用户点击Spotlight搜索结果中的索引项时,您的应用代理的application:continueUserActivity:restorationHandler:方法被调用(这与您实现支持Handoff
的方法相同)。在这种情况下,您的应用程序代理接收的活动类型是CSSearchableItemActionType,它可以帮助您确定显示给用户的应用程序内容。Creating Searchable Items更详细地描述了该过程。
除了使用Core Spotlight API
使应用程序内容可搜索之外,您还应使用NSUserActivity API
使应用程序状态和导航点可搜索(您可以了解有关Index Activities and Navigation Points中的索引活动的更多信息)。两个API都使用相同的对象来提供有关可搜索项目的元数据(即CSSearchableItemAttributeSet对象),并且两者都为您提供了防止搜索结果中项目重复的方法。但是,与NSUserActivity API不同,Core Spotlight API不要求用户在编制索引之前访问内容。详细了解使用多个搜索相关的API请查看Combine APIs to Increase Coverage。
1. Creating Searchable Items - 创建可搜索项目
要使内容可搜索,请首先创建一个属性集,其中包含指定要在搜索结果中显示有关项目的元数据的属性。 您选择的属性会有所不同,具体取决于您的域:您可以使用Core Spotlight
在CSSearchableItemAttributeSet
中定义的类别中提供的属性,也可以定义自己的属性。 (如果要定义自定义属性,请在定义中尽可能具体,并使用contentTypeTree属性,以便自定义属性可以从已知类型继承。)
注意:虽然只需要
title
,uniqueIdentifier
和attributeSet
属性,但强烈建议您还为thumbnailData
和contentDescription
属性提供特定于内容的值。
接下来,创建一个CSSearchableItem对象来表示该项并将其添加到设备上的索引。 创建可搜索项时,必须指定唯一标识符,以便可以访问索引中的项。 (请注意,您需要为一段时间后仍应搜索的项目指定适当的到期日期;有关详细信息,请参阅expirationDate。)您还可以指定用于标识项目的组或所有者的域标识符,并允许您 同时访问项目组。 Listing 4-1
显示了如何创建CSSearchableItem
对象并对其进行索引。
// Listing 4-1 Creating a searchable item and adding it to the on-device index
// Create an attribute set to describe an item.
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)
// Add metadata that supplies details about the item.
attributeSet.title = "July Report.Numbers"
attributeSet.contentDescription = "iWork Numbers Document"
attributeSet.thumbnailData = DocumentImage.jpg
// Create an item with a unique identifier, a domain identifier, and the attribute set you created earlier.
let item = CSSearchableItem(uniqueIdentifier: "1", domainIdentifier: "file-1", attributeSet: attributeSet)
// Add the item to the on-device index.
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { error in
if error != nil {
print(error?.localizedDescription)
}
else {
print("Item indexed.")
}
}
使用Listing 4-1
中所示的代码,将表示Numbers文档的项添加到设备上索引。 当用户搜索文档标题的一部分时,搜索结果如下所示:
当用户在Spotlight搜索结果中点击您应用中的可搜索项目时,您的应用代理的application:continueUserActivity:restorationHandler:方法被调用。 在此方法的实现中,检查传入活动的类型以确认您的应用程序正在打开,因为用户在搜索结果中点击了索引项。 Listing 4-2
显示了application:continueUserActivity:restorationHandler:
的主要实现。
// Listing 4-2 Continuing the activity that represents the searchable item
func application(UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: [AnyObject]? -> Void) -> Bool {
if userActivity.activityType == CSSearchableItemActionType {
// This activity represents an item indexed using Core Spotlight, so restore the context related to the unique identifier.
// Note that the unique identifier of the Core Spotlight item is set in the activity’s userInfo property for the key CSSearchableItemActivityIdentifier.
let uniqueIdentifier = userActivity.userInfo? [CSSearchableItemActivityIdentifier] as? String
// Next, find and open the item specified by uniqueIdentifer.
}
return true
}
CSSearchableItemAttributeSet类还可以帮助您支持用户可以从搜索结果中的项目中执行的操作;具体而言,您可以让用户拨打电话或获取前往某个位置的路线。要启用电话呼叫,请将项目的supportsPhoneCall属性设置为1
,并在phoneNumbers属性中指定电话号码。确保仅在适当时启用电话呼叫操作,并且它代表用户可能采取的主要操作。例如,让用户呼叫业务是有意义的,但让用户拨打恰好在研究报告上显示的电话号码是没有意义的。
要帮助用户获取搜索结果中描述的位置的路线,请将项目的supportsNavigation属性设置为1
,并提供latitude和longitude属性的值。与电话呼叫操作一样,请务必仅在有意义的情况下启用导航操作。例如,您不会为某人的照片启用导航,但您可以为代表餐馆评论的项目启用导航。
2. Maintaining the Index - 维持索引
使设备上的索引保持最新对于确保应用程序的搜索结果保持相关性至关重要。 当搜索结果包含相关项目时,用户更有可能与他们互动,这反过来又有助于提高可搜索项目的排名。
Core Spotlight
提供了几个可用于处理索引的API,并使其保持最新。 例如,Listing 4-3
显示了如何使用用于向索引添加新项的相同方法来更新索引。
// Listing 4-3 Updating the index
func indexSearchableItems(items: [CSSearchableItem], completionHandler: ((NSError?) -> Void)?)
您还可以使用indexSearchableItems:completionHandler:方法更新项目的标题,描述或任何其他属性。
要确保在搜索结果中仅返回相关项,您可能需要删除索引项。 Core Spotlight提供了一些从索引中删除项目的方法,其中三种方法如Listting 4-4
所示。
// Listing 4-4 Three ways to delete items from the on-device index
// Delete the items represented by an array of unique identifiers.
func deleteSearchableItemsWithIdentifiers(identifiers: [String], completionHandler: ((NSError?) -> Void)?)
// Delete the items represented by an array of domains.
func deleteSearchableItemsWithDomainIdentifiers(domainIdentifiers: [String], completionHandler: ((NSError?) -> Void)?)
// Delete all items from the on-device index.
func deleteAllSearchableItemsWithCompletionHandler(completionHandler: ((NSError?) -> Void)?)
3. Using Advanced Features - 使用高级功能
Core Spotlight
支持高级功能,可帮助您批量更新索引,防止更新索引数据时出现问题,和在应用程序未运行时执行索引更新。 例如,Core Spotlight包括对数据保护类的支持,可帮助您为要编制索引的信息选择适当的安全策略(要了解有关使用保护类的更多信息,请参阅initWithName:protectionClass:)。 要利用Core Spotlight
高级功能,请确保在应用程序中设置indexDelegate属性并实现CSSearchableIndexDelegate所需的方法。
当您必须索引多个项目时,可以将任务分解为批次并保存索引过程的状态。 Listig 4-5
显示了如何对索引执行批量更新。
// Listing 4-5 Batching updates to the index
CSSearchableIndex *index = [CSSearchableIndex new];
[index beginIndexBatch];
[index indexSearchableitems:items completionHandler:nil];
[index deleteSearchableItemsWithIdentifiers:identifiers completionHandler:nil];
[index endIndexBatchWithClientState:clientState completionHandler:^(NSError *error) {
// Handle errors.
}];
要恢复索引,请使用clientState
参数的值来确定重新启动的位置,如Listing 4-6
所示。
// Listing 4-6 Restarting a batched update to the index
CSSearchableIndex *index = [CSSearchableIndex new];
[index fetchLastClientStateWithCompletionHandler:^(NSData *clientState, NSError *error) {
if(error == nil) {
NSArray *items = // Fetch a batch of items for the specified client state.
[index beginIndexBatch];
[index indexSearchableitems:items completionHandler:nil];
[index endIndexBatchWithClientState:clientState completionHandler:^(NSError *error) {
// Handle errors.
}];
}
}];
Core Spotlight定义了一个应用扩展程序,您可以在应用程序未运行时对其进行索引。 当索引丢失或者保存已编制索引的数据时出现问题,系统会调用此扩展,如果应用程序崩溃,可能会发生这种情况。 Listing 4-7
显示了编写此类应用程序扩展的一种方法。
// Listing 4-7 Creating an index-maintenance app extension
@interface MyIndexRequestExtensionHandler : CSIndexExtensionRequestHandler
@end
@implementation MyIndexRequestExtensionHandler
- (void)searchableIndex:(CSSearchableIndex *)searchableIndex reindexAllSearchableItemsWithAcknowledgementHandler:(void (^)(void))acknowledgementHandler {
// Use index API to re-index all your data.
// Call the acknowledgement handler when this is done.
}
- (void)searchableIndex:(CSSearchableIndex *)searchableIndex reindexSearchableItemsWithIdentifiers:(NSArray *)identifiers acknowledgementHandler:(void (^)(void))acknowledgementHandler {
// Use index API to re-index data with the specified identifiers.
// Call the acknowledgement handler when this is done.
}
@end
后记
本篇主要讲述了让项目可索引之索引应用内容,感兴趣的给个赞或者关注~~~