? ? spotlight 功能就是指在 iPhone 內搜索應用程序中內容的功能。通俗的說法就是,若是某些界面的一些數據你希望被用戶在 spotlight 能搜索到,那么這部分數據用戶需要存到本地。在 spotlight 搜索的時候拿到你本地的數據,若是有匹配到的數據那么就會展示出來。大致功能如下圖所示:
用法簡介
若是想要被 spotlight 搜索到,那么數據格式必須轉換為 spotlight 支持的模型。spotlight 支持的類型是 CSSearchableItem,創建 CSSearchableItem 又需要創建 CSSearchableItemAttributeSet 對象,我們通過 spotlight 搜索出的數據就是 CSSearchableItemAttributeSet 對象的各個屬性。如圖:
示例代碼
如實想調用spotlight相關功能,首先需要導入CoreSpotlight.framework。工程項目》Build Phases》Link Binary With Libraries》+
//在你獲得一些數據并且希望這些數據能夠被檢索到時,通過以下方法創建CSSearchableItem并存入本地
CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"image"];?
attributeSet.title = @“預測101前三排名”;? ? ? ?
attributeSet.keywords = @[@“預測101前三排名”,@"創造101",@"孟美岐"];? ? ? ?
attributeSet.contentDescription = @“山支必須第一,宣儀第二,超越妹子第三好了”;
attributeSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:message.icon]);? ? ? ? ? ? ? ? ?
CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@“firstItem” domainIdentifier:@"zeus" attributeSet:attributeSet];
CSSearchableItem 參數:
UniqueIdentifier? 信息標識符,在進入app時可以通過這個標識符來判斷具體跳轉入哪個界面
domainIdentifier? 用來區別不同app或者不同模塊的標識符
attributeSet? 內容對象
將包裝好的數據存入本地(通過 CSSearchableIndex 來實現)
//將數據保存到本地,參數 SearchableItems 就是傳入元素是 CSSearchableItem 對象的數組
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchableItems completionHandler:^(NSError * _Nullable error) {?? ? ? ?? ? ? ?
????if (error) {? ? ? ? ? ?
????????NSLog(@"save error");? ? ? ?
????}else {? ? ? ? ?
????????? NSLog(@"save success");? ? ? ? ? ??
? }?? ? ? ?? ?
}];
實現以上步驟就可以在 spotlight 中搜索到你設置的相關內容了。如果希望點擊到具體信息能夠跳轉到相關頁面,則需要在 AppDelegate 中實現?- (BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void(^)(NSArray*_Nullable))restorationHandler 這個方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{? ? ?
????NSString *idetifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];? ? ? ?
????//firstItem 就是前面在創建?CSSearchableItem 對象時傳入的參數?UniqueIdentifier
????if ([idetifier isEqualToString:@"firstItem"]) {? ? ? ?
????????NSLog(@"跳轉到標識為 firstItem 的界面");? ?
????}?? ?? ?
????return YES;
}
至此就可以實現 spotlight 的功能了。具體代碼可參考Demo。在demo中,我是通過控制器的 restoreUserActivityState 方法將 userActivity 傳給最底層的控制器,讓控制器通過標識去判斷跳轉的具體界面。底層控制器也需要實現 restoreUserActivityState 方法。