iOS實現(xiàn)SpotLight搜索 讓你的APP支持SpotLight搜索

隨著項目的開發(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è)置  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容