iOS9.0 Spotlight的使用方法及总结的一些坑点

首先使用该功能,必须是iOS9.0之上的系统,然后需要导入CoreSpotlight.framework框架。

下面我们将介绍如何快速的给自己的程序集成Spotlight功能,及在搜索出来的列表下支持快速通话功能

效果图如下(Demo下载地址:http://download.csdn.net/detail/longitachi/9336973)


总的来说,使程序支持Spotlight的基本功能使用下面三个类即可

CSSearchableItemAttributeSet
CSSearchableItem
CSSearchableIndex

首先针对于每个需要创建Spotlight索引的数据对其创建一个CSSearchableItemAttributeSet对象

该对象包含了你需要的所有属性

CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"Person"];
attributeSet.title = @"标题";
attributeSet.contentDescription = @"描述";
//缩略图图片data
attributeSet.thumbnailData = UIImagePNGRepresentation(image);
//电话号码
attributeSet.phoneNumbers = @[obj.phoneNumber];
//开启显示电话按钮,若phoneNumbers为空,则开启了该权限也不会显示电话按钮
attributeSet.supportsPhoneCall = @(YES);

为其创建一个对应的CSSearchableItem对象

CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:obj.name domainIdentifier:@"ZL.Spotlight" attributeSet:attributeSet];

最后一步创建Spotlight索引

[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler:^(NSError * _Nullable error) {

        }];

当然我们的数据肯定不止一个,所以要去循环我们的数据源。

获取点击的索引

appDelegate 中提供了该方法

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    //我们可以根据创建索引时设置的identifiler进行相应的操作
    NSString *idetifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];
    
    return YES;
}

坑点1

我们有时候并不是创建完Spotlight索引就没其他事了,可能会在用户的账号退出的时候去对索引进行一个清除,及换账号时候的重建,这时候我们会用到删除索引的功能,apple提供给我们三个方法去删除
- (void)deleteSearchableItemsWithIdentifiers:(NSArray<NSString *> *)identifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;

- (void)deleteSearchableItemsWithDomainIdentifiers:(NSArray<NSString *> *)domainIdentifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;

- (void)deleteAllSearchableItemsWithCompletionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;

那我在我们先删除在创建新的索引之后,兴致勃勃的去进行Spotlight搜索新索引时候,会发现并没有什么卵用。这边是我要说的第一个坑点:索引的创建及删除都是在一个子线程里
在子线程里也就说明我们无法控制其执行的先后顺序。
测试代码如下
[[CSSearchableIndex defaultSearchableIndex] deleteAllSearchableItemsWithCompletionHandler:^(NSError * _Nullable error) {
    NSLog(@"删除索引的线程.%@", [NSThread currentThread]);
}];
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchItems completionHandler:^(NSError * _Nullable error) {
    NSLog(@"创建索引的线程.%@", [NSThread currentThread]);
}];

输出结果如下,而且实验多次,几乎都是是创建索引的线程先执行完毕

测试结果1:

2015-12-08 15:12:26.579 Spotlight[1008:85961] 创建索引的线程.<NSThread: 0x7fd671d524c0>{number = 2, name = (null)}
2015-12-08 15:12:26.583 Spotlight[1008:85961] 删除索引的线程.<NSThread: 0x7fd671d524c0>{number = 2, name = (null)}

测试结果2:

2015-12-08 15:12:51.525 Spotlight[1013:86723] 删除索引的线程.<NSThread: 0x7fd570c3f6a0>{number = 2, name = (null)}
2015-12-08 15:12:51.577 Spotlight[1013:86683] 创建索引的线程.<NSThread: 0x7fd570c33ee0>{number = 3, name = (null)}
测试结果3:

2015-12-08 15:13:11.427 Spotlight[1017:87190] 创建索引的线程.<NSThread: 0x7f8a12e36770>{number = 2, name = (null)}
2015-12-08 15:13:11.431 Spotlight[1017:87189] 删除索引的线程.<NSThread: 0x7f8a12dd57a0>{number = 3, name = (null)}

所以当我们需要先删除索引再去创建索引的时候需要把创建索引的方法放到删除索引的内部

坑点2

当我们为我们的数据创建完索引之后,如果用户做了换了头像之类的操作,那么我们需要为该条数据进行一个Spotlight索引的更新,去改变该条数据的缩略图

那么此时你又掉坑里了,而且这个坑有点大
当我们更新完Spotlight索引的缩略图之后(我采用的方法是重新创建一遍,暂时没有找到如何去更新索引的方法),这时候我们怀着索引已经改变图片的心情再次去进行Spotlight搜索我们的数据,好吧,还是并没有什么卵用,发现根本换成新的图片。这个坑怎么解决呢。重点来了,客观,请仔细看好了:
重启手机。。。

我怀着非常忐忑的心情去测试了一下苹果的通讯录的Spotlight功能。
1:去通讯录为一个编辑一个联系人,连续为该联系人换两张头像;
2:然后再去Spotlight搜索,发现搜出来的是我们第一次设置的头像。

结果发现苹果自带的应用和我们的一样,搜出来的联系人并没有和我们期望的一样去实时更新Spotlight索引的缩略图,重启手机后才有。所以这是苹果的一个坑,暂时跳不出来。

暂时就发现了这两个坑,大家使用时候如果遇到新的坑点欢迎来评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值