隨著項目的開發(fā)冠跷,功能需求越來越多爹凹,有的沒什么卵用厨诸,有的倒是能提示不少逼格,這次接到的功能是實現(xiàn)iOS SpotLight搜索效果逛万。
這個功能很早就有,主要功能是在iOS9系統(tǒng)界面下拉會出現(xiàn)搜索功能界面批钠,在這里可以搜索關(guān)鍵信息宇植,來展示應(yīng)用內(nèi)的內(nèi)容,并且點擊信息打開應(yīng)用跳轉(zhuǎn)具體頁面等操作埋心。這個功能還是很有用的指郁,面對這越來越多的應(yīng)用霸占你手機(jī),給你的應(yīng)用加上這么一個搜搜功能拷呆,還是有點與眾不同闲坎,主要是提升逼格〔绺看看效果圖腰懂。
這里可以顯示應(yīng)用內(nèi)的一些信息,挺豐富的项秉,有圖片绣溜,標(biāo)題,副標(biāo)題娄蔼。
第一步:首先導(dǎo)入CoreSpotlight.framework框架
在需要實現(xiàn)的界面
#import <CoreSpotlight/CoreSpotlight.h>
比如你的應(yīng)用是一個新聞類的怖喻,有列表頁面,點擊能進(jìn)入新聞詳情頁面岁诉,你想在外面能搜索到新聞信息锚沸。
然后實現(xiàn)代碼
- (void)setupSpotlight
{
if ([UIDevice currentDevice].systemVersion.floatValue < 9.0) {
return;
}
/*應(yīng)用內(nèi)搜索,想搜索到多少個界面就要創(chuàng)建多少個set 涕癣,每個set都要對應(yīng)一個item*/
CSSearchableItemAttributeSet *firstSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"firstSet"];
//標(biāo)題
firstSet.title = @"測試firstView";
//詳細(xì)描述
firstSet.contentDescription = @"測試firstView哈哈哈哈哈哈哈";
//關(guān)鍵字
firstSet.contactKeywords = @[@"first",@"測試",@"firstView"];
//設(shè)置圖片
//這里的url也必須是本地文件路徑哗蜈,而不是網(wǎng)絡(luò)圖片url
// firstSet.thumbnailURL = [NSURL URLWithString:@"http://www.jf258.com/uploads/2014-09-11/195154600.jpg"];
//也可以用這個圖片加載方法
firstSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"耳機(jī)"]);
/*
這里有個小細(xì)節(jié):
設(shè)置的圖片展示的效果系統(tǒng)并不會給你處理,意思是說,如果你傳了一張長方形的圖片做封面icon恬叹,你在搜索列表上展示的icon就是長方形的候生,如果長寬比很大的話,很很難看绽昼,所以這里盡量保證圖片趨近去正方形唯鸭,使得展示效果好看點。
或者在自己裁剪處理下趨近正方形硅确。
*/
CSSearchableItemAttributeSet *secondSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"secondSet"];
secondSet.title = @"測試secondView";
secondSet.contentDescription = @"測試secondView哈哈哈哈哈哈哈";
secondSet.contactKeywords = @[@"second",@"測試",@"secondView"];
secondSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"耳機(jī)"]);
//UniqueIdentifier每個搜索都有一個唯一標(biāo)示目溉,當(dāng)用戶點擊搜索到得某個內(nèi)容的時候,系統(tǒng)會調(diào)用代理方法菱农,會將這個唯一標(biāo)示傳給你缭付,以便讓你確定是點擊了哪一,方便做頁面跳轉(zhuǎn)
//domainIdentifier搜索域標(biāo)識循未,刪除條目的時候調(diào)用的delegate會傳過來這個值
CSSearchableItem *firstItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"firstItem" domainIdentifier:@"first" attributeSet:firstSet];
CSSearchableItem *secondItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"secondItem" domainIdentifier:@"second" attributeSet:secondSet];
NSArray *items = @[firstItem,secondItem];
//把上面的設(shè)置item都添加進(jìn)入
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:items completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"失敗%@",error);
}
else {
NSLog(@"成功");
}
}];
}
接下來我自己項目代碼實現(xiàn)參考
#pragma mark - Spotlight
- (void)setupSpotlight
{
NSString *eventLevel = [NSString stringWithFormat:@"賽事級別:%@",self.levels[self.eventDetail.eventLevel]];
NSString *eventTime = [NSString stringWithFormat:@"賽事時間:%@-%@",[GlobalPublicMethods formatTime:self.eventDetail.eventStratTime format:@"yyyy/MM/dd"], [GlobalPublicMethods formatTime:self.eventDetail.eventEndTime format:@"yyyy/MM/dd"]];
UIImage *spotlightImage = [[YYImageCache sharedCache] getImageForKey:[self.eventDetail.bannerImages firstObject]];
spotlightImage = [spotlightImage compressImageSize:CGSizeMake(100, 100)];
CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"EventDetail"];
attributeSet.title = self.eventDetail.title;
attributeSet.contentDescription = [NSString stringWithFormat:@"%@\n%@",eventLevel,eventTime];
attributeSet.thumbnailData = UIImageJPEGRepresentation(spotlightImage, 1.0);
attributeSet.keywords = @[@"野途",@"wildto",@"賽事",@"級別",@"時間",self.eventDetail.title];
CSSearchableItem *item = [[CSSearchableItem alloc]initWithUniqueIdentifier:self.eventID domainIdentifier:@"賽事詳情" attributeSet:attributeSet];
NSArray *items = @[item];
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:items completionHandler:^(NSError * _Nullable error) {
if (error) {
DLog(@"失敗%@",error);
}
else {
DLog(@"成功");
}
}];
}
做到這里陷猫,你就能夠在系統(tǒng)界面下拉搜索到這個app里面保存好的信息,如果實現(xiàn)點擊cell打開應(yīng)用進(jìn)入具體界面的操作的妖,還必須實現(xiàn)下面的代理方法
第二步:在Appdelegate實現(xiàn)
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
NSString *idetifier = userActivity.userInfo[CSSearchableItemActivityIdentifier];
NSLog(@"%@",idetifier);
UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
if ([idetifier isEqualToString:@"firstItem"]) {
SpotlightViewController *firstVC = [[SpotlightViewController alloc]init];
[nav pushViewController:firstVC animated:YES];
}
else if ([idetifier isEqualToString:@"secondItem"]){
UIViewController *secondVC = [[UIViewController alloc]init];
secondVC.title = @"第二個";
secondVC.view.backgroundColor = [UIColor orangeColor];
[nav pushViewController:secondVC animated:YES];
}
return YES;
}
補(bǔ)充:SpotLight還提供了幾個刪除搜索索引的方法
- (void)deleteSearchableItemsWithIdentifiers:(NSArray<NSString *> *)identifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{
//根據(jù)標(biāo)志來刪除指定的保存設(shè)置
}
- (void)deleteSearchableItemsWithDomainIdentifiers:(NSArray<NSString *> *)domainIdentifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{
}
- (void)deleteAllSearchableItemsWithCompletionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{
//刪除所有的保存設(shè)置
}