iOS開發 iOS9 Spotlight 應用內搜尋簡單介紹

敖老黑發表於2018-01-03

還是直插正題,有錯誤請指出。

Spotlight這個功能很早就有了,可能大部分人覺得這個東西沒有什麼用。但是如果應用裝的很多的時候,比如你裝了幾百個應用,你很難快速的在桌面上找到你想要的應用。這個時候Spotlight就體現出作用了。iOS9蘋果提供了更強大的應用內搜尋功能,以前只能搜尋到你的app,從iOS9開始你可以搜尋到你應用內的某一個功能,使用者通過搜尋點選可以直接進入應用內的某一功能模組。。。算了還是不墨跡了。。我這個文筆還是非常醉人的,下面開始介紹這個spotlight的簡單使用

首先做了一些準備工作,建立專案拉等等,

建立工程.png

如上圖做了幾個簡單介面用來做後面的跳轉~~~分別設定幾個顏色用於區分是哪一個介面。不要問我為啥用這個幾個顏色,,,因為我猜你們喜歡黃色。。。

firstView 為橙色view secondView為黃色view

接下來匯入標頭檔案 #import <CoreSpotlight/CoreSpotlight.h> 我是在appdelegate 裡面匯入的,並且在程式啟動的時候初始化並設定搜尋。

設定Spotlight的方法 *建立CSSearchableItemAttributeSet物件

CSSearchableItemAttributeSet *firstSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"firstSet"];
複製程式碼

//標題     firstSet.title = @"測試firstView";     //詳細描述     firstSet.contentDescription = @"測試firstView哈哈哈哈哈哈哈";     //關鍵字,     NSArray *firstSeachKey = [NSArray arrayWithObjects:@"first",@"測試",@"firstView", nil];     firstSet.contactKeywords = firstSeachKey; 注:搜尋介面顯示的屬性都是在這裡設定的。展示內容,圖片等等

展示.png

*建立CSSearchableItem物件

CSSearchableItem *firstItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"firstItem" domainIdentifier:@"first" attributeSet:firstSet];
複製程式碼

注:每個set都要對應一個item。

*設定搜尋

[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:itemArray completionHandler:^(NSError * _Nullable error) {
複製程式碼

if (error) {             NSLog(@"設定失敗%@",error);

}else{                      NSLog(@"設定成功");         }     }];

這個樣子搜尋就設定完了。通過你設定的關鍵字可以在Spotlight裡搜尋到你設定的內容,完整方法如下

- (void)setSpotlight{
複製程式碼

/應用內搜尋,想搜尋到多少個介面就要建立多少個set ,每個set都要對應一個item/     CSSearchableItemAttributeSet *firstSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"firstSet"];     //標題     firstSet.title = @"測試firstView";     //詳細描述     firstSet.contentDescription = @"測試firstView哈哈哈哈哈哈哈";     //關鍵字,     NSArray *firstSeachKey = [NSArray arrayWithObjects:@"first",@"測試",@"firstView", nil];     firstSet.contactKeywords = firstSeachKey;          CSSearchableItemAttributeSet *secondSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"secondSet"];     secondSet.title = @"測試SecondView";     secondSet.contentDescription = @"測試secondView哈哈哈哈哈哈哈哈";     NSArray *secondArrayKey = [NSArray arrayWithObjects:@"second",@"測試",@"secondeVIew", nil];     secondSet.contactKeywords = secondArrayKey;          //UniqueIdentifier每個搜尋都有一個唯一標示,當使用者點選搜尋到得某個內容的時候,系統會呼叫代理方法,會將這個唯一標示傳給你,以便讓你確定是點選了哪一,方便做頁面跳轉     //domainIdentifier搜尋域標識,刪除條目的時候呼叫的delegate會傳過來這個值     CSSearchableItem *firstItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"firstItem" domainIdentifier:@"first" attributeSet:firstSet];          CSSearchableItem *secondItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"secondItem" domainIdentifier:@"second" attributeSet:secondSet];          NSArray *itemArray = [NSArray arrayWithObjects:firstItem,secondItem, nil];          [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:itemArray completionHandler:^(NSError * _Nullable error) {         if (error) {             NSLog(@"設定失敗%@",error);

}else{                      NSLog(@"設定成功");         }     }];      }

之後在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中呼叫

NSLog(@"%f",[UIDevice currentDevice].systemVersion.floatValue);
複製程式碼

if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) {                 [self setSpotlight];     }      現在設定搜尋就設定完了。但是現在點選之後還是隻能進入應用不能進入指定的介面。還需要實現下面的代理,在代理方法裡面做一些操作

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
複製程式碼

NSString *idetifier  = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];     NSLog(@"%@",idetifier);          UINavigationController *nav = (UINavigationController *)self.window.rootViewController;     UIStoryboard *stroy = [UIStoryboard storyboardWithName:@"Main" bundle:nil];          if ([idetifier isEqualToString:@"firstItem"]) {                  FirstViewController *fistVc = [stroy instantiateViewControllerWithIdentifier:@"firstView"];         [nav pushViewController:fistVc animated:YES];              }else if ([idetifier isEqualToString:@"secondItem"]){                  SecondViewController *secondVc = [stroy instantiateViewControllerWithIdentifier:@"secondView"];         [nav pushViewController:secondVc animated:YES];     }          return YES; }

OK,全部完成~~~~系統還給提供了幾個刪除item的方法

- (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{

}
複製程式碼

文章演示demo

相關文章