iOS 9 Core Spotlight 框架
Core Spotlight框架用来索引应用内的内容。它创建的索引存储在设备上,不与Apple共享,也不能被其他应用或者设备访问。
Apple的指南中特别提到Core Spotlight创建的索引最好在几千的数量级别之下。索引太多很有可能会带来性能问题
- CSSearchableItemAttributeSet:索引属性集合,也即是索引的内容本身。集合中可以存储以下属性:
title
,contentDescription
,thumbnailData
,rating
,keywords
. - CSSearchableItem:用来表示一个被索引的条目,通过来可以关联到应用内的记录。CSSearchableItem依赖于,它在构建的时候需要传入一个
CSSearchableItemAttributeSet
对象。
实战
1.引用头文件
#import <CoreSpotlight/CoreSpotlight.h>
#import <MobileCoreServices/MobileCoreServices.h>
2.创建索引
-(void) buildSearchableItem{
CSSearchableItemAttributeSet* attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString*)kUTTypeText];
attributeSet.title = self.name;
CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:
[self indexPath]
domainIdentifier:@"markdisk.file" attributeSet:attributeSet];
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler:^(NSError * error) {
if (error) {
NSLog(@"buildSearchableItem Error:%@",error.localizedDescription);
}
}];
}
3.删除索引
[[CSSearchableIndex defaultSearchableIndex] deleteSearchableItemsWithIdentifiers:@[[_itemToRemove indexPath] ] completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error.localizedDescription);
}
}];
提供删除的API
- deleteAllSearchableItemsWithCompletionHandler:
- deleteSearchableItemsWithDomainIdentifiers:completionHandler:
- deleteSearchableItemsWithIdentifiers:completionHandler:
4.Appdelegate.m中响应搜索结果
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([[userActivity activityType] isEqualToString:CSSearchableItemActionType]) {
//获取唯一ID,在MarkDisk中,它即是文件的相对路径
NSString *uniqueIdentifier = [userActivity.userInfo objectForKey:CSSearchableItemActivityIdentifier];
UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
UIViewController *VC = nav.viewControllers.firstObject;
// 调用自己的方法
//显示对应的文件,代码略
...
}
return YES;
}