隨著項目的開發(fā),功能需求越來越多,有的沒什么卵用,有的倒是能提示不少逼格,這次接到的功能是實現(xiàn)iOS SpotLight搜索效果。
這個功能很早就有,主要功能是在iOS9系統(tǒng)界面下拉會出現(xiàn)搜索功能界面,在這里可以搜索關(guān)鍵信息,來展示應(yīng)用內(nèi)的內(nèi)容,并且點擊信息打開應(yīng)用跳轉(zhuǎn)具體頁面等操作。這個功能還是很有用的,面對這越來越多的應(yīng)用霸占你手機,給你的應(yīng)用加上這么一個搜搜功能,還是有點與眾不同,主要是提升逼格。看看效果圖。
這里可以顯示應(yīng)用內(nèi)的一些信息,挺豐富的,有圖片,標題,副標題。
第一步:首先導入CoreSpotlight.framework框架
在需要實現(xiàn)的界面
#import <CoreSpotlight/CoreSpotlight.h>
比如你的應(yīng)用是一個新聞類的,有列表頁面,點擊能進入新聞詳情頁面,你想在外面能搜索到新聞信息。
然后實現(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"];
//標題
firstSet.title = @"測試firstView";
//詳細描述
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:@"耳機"]);
/*
這里有個小細節(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:@"耳機"]);
//UniqueIdentifier每個搜索都有一個唯一標示,當用戶點擊搜索到得某個內(nèi)容的時候,系統(tǒng)會調(diào)用代理方法,會將這個唯一標示傳給你,以便讓你確定是點擊了哪一,方便做頁面跳轉(zhuǎn)
//domainIdentifier搜索域標識,刪除條目的時候調(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都添加進入
[[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)用進入具體界面的操作,還必須實現(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;
}
補充:SpotLight還提供了幾個刪除搜索索引的方法
- (void)deleteSearchableItemsWithIdentifiers:(NSArray<NSString *> *)identifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{
//根據(jù)標志來刪除指定的保存設(shè)置
}
- (void)deleteSearchableItemsWithDomainIdentifiers:(NSArray<NSString *> *)domainIdentifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{
}
- (void)deleteAllSearchableItemsWithCompletionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{
//刪除所有的保存設(shè)置
}