App搜索编程指南(四) —— 让项目可索引之索引应用内容(一)

版本记录

版本号 时间
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 SpotlightCSSearchableItemAttributeSet中定义的类别中提供的属性,也可以定义自己的属性。 (如果要定义自定义属性,请在定义中尽可能具体,并使用contentTypeTree属性,以便自定义属性可以从已知类型继承。)

注意:虽然只需要titleuniqueIdentifierattributeSet属性,但强烈建议您还为thumbnailDatacontentDescription属性提供特定于内容的值。

接下来,创建一个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,并提供latitudelongitude属性的值。与电话呼叫操作一样,请务必仅在有意义的情况下启用导航操作。例如,您不会为某人的照片启用导航,但您可以为代表餐馆评论的项目启用导航。

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

后记

本篇主要讲述了让项目可索引之索引应用内容,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容