金田(github 示例源碼)html
在iOS9以前咱們只能使用Spotlight來搜索應用名稱來打開指定App,而其餘的內容都是提供給系統使用(信息,聯繫人,郵件等)。在iOS9之後Apple容許開發者設置應用中任意內容能夠被Spotlight索引到以及用戶在選擇了搜索內容時會發生什麼。如demo所示:git
圖1 Spotlight搜索應用內結果示意圖github
在iOS9中提供了三種API來幫助咱們實現搜索,以下:swift
圖2 iOS 9新增搜索APIapp
NSUserActivity包含了一些新的方法和屬性來幫助咱們實現索引activities和應用狀態使他們在搜索結果中可用。每個應用均可以利用NSUserActivity API來生成對於用戶來講更有用的內容。順便提一句NSUserActivity在iOS8中的Handoff就已經被引入了。框架
這一特性容許應用鏡像本身的內容,並在Spotlight中創建本身的引用。蘋果的爬蟲會抓取你的網站上打了markup的內容,而這些內容會提供給Safari和Spotlight。這個特性的神奇之處在於。用戶不須要將你的應用安裝在手機上。這樣你的應用能夠更多的展現給潛在用戶。蘋果的雲服務會索引你的內容,讓你的應用與Public Search API保持深度的連接會讓你收益頗多。dom
新的CoreSpotlight(framework)是iOS9提供的一組新的API來幫助你創建起你的應用中的索引。CoreSpotlight是用來處理用戶數據的好比:文檔,照片以及其餘類型的由用戶產生的內容。ide
首先咱們使用三個不一樣的ViewController來加載不一樣的用戶數據:網站
而後使用一個TableView用來索引他們這一部分的代碼就不贅述具體結構如圖ui
圖3 Demo 初始化
圖4 iPhone Demo截圖
好,萬事具有,只欠CoreSpotlight啦
先將framework導入
工程->Build Phases->Link Binary With Libraries->搜索CoreSpotlight
若是搜索不到請確認本身使用的是Xcode7
圖 5 添加CoreSpotlight框架
接下來就是最重要的代碼部分了
首先,導入頭文件
#import <CoreSpotlight/CoreSpotlight.h>
而後將須要索引的數據保存至CoreSpotlight
- (void)saveData{
NSMutableArray *seachableItems = [NSMutableArray new];
[self.tableData enumerateObjectsUsingBlock:^(NSString *__nonnull obj, NSUInteger idx, BOOL * __nonnull stop) {
CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"views"];
attributeSet.title = obj;
attributeSet.contentDescription = [NSString stringWithFormat:NSLocalizedString(@"a easy way to open %@", nil),obj];
UIImage *thumbImage = [UIImage imageNamed:[NSString stringWithFormat:@"icon_%@.png",obj]];
attributeSet.thumbnailData = UIImagePNGRepresentation(thumbImage);//beta 1 there is a bug
CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:obj domainIdentifier:@"com.kdanmobile.CoreSpotlightDemo" attributeSet:attributeSet];
[seachableItems addObject:item];
}];
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:seachableItems
completionHandler:^(NSError * __nullable error) {
if (!error)
NSLog(@"%@",error.localizedDescription);
}];
}
執行下程序而後到Spotlight查看是否有保存進去
若是沒保存進去沒關係,嘗試重啓下模擬器再到Spotlight中查看應該就有了。這應該事Xcode的一個bug
另外關於CSSearchableItemAttributeSet的各個屬性的含義以下圖所示
圖 6 Demo Spotlight搜索示意圖
如今咱們點擊搜索到相應的項還只能打開咱們的應用,若是要實現跳轉還須要進行一小步的工做:在AppDelegate中實現
- (BOOL)application:(nonnull UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * __nullable))restorationHandler{
NSString *idetifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
[navigationController popToRootViewControllerAnimated:YES];
CoreSpotlightTableViewController *coreViewController = [[navigationController viewControllers] firstObject];
[coreViewController showViewControllerWithIdentifier:idetifier];
return YES;
}
而在實現這個方法後在點擊spotlight中點擊相應的項就會跳轉到咱們相應的ViewController中啦
圖7 Demo Spolight 搜索截圖
最後須要提到的就是索引的刪除。CoreSpotlight給咱們提供了三個方法來進行刪除分別是:
- (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;
根據identifier來刪除,根據domain來刪除以及刪除全部的索引。
從Xcode7自動補全的代碼看來出現了不少之前不常見的代碼如:nonnull , __nullable,NSArray<NSString *>,等,其中nonull在Xcode6的某個版本日後就提供了。目的是用來更好的與swift中的optional變量鏈接。從這些看來之後蘋果的重心將慢慢往swift轉移。