在iOS 9.0以前,Apple Spotlight僅可以檢索iOS自身應用的內容,好比郵件、備忘錄、提醒、短信。第三方應用不支持被檢索,好比美團、大衆點評、今日頭條等等。在iOS9.0以後,iOS蘋果推出Search API,使得第三方APP內的頁面內容也能夠被檢索。應用開發者按照Search API編程,而後用戶在Spotlight和Safari能夠直接搜APP內的內容(In-App Search),這帶來很大的價值點。git
據WWDC官方公佈的用戶習慣數據,用戶86%的時間花在APP中,僅有14%的時間花在 Web上。因此APP有着較好的用戶體驗很是重要。github
對APP開發者而言:
最大價值是提升APP的打開率,從而提升了APP的留存及活躍,提升APP的曝光度,用戶可以更加方便的達到內容。編程
對用戶而言:
對於安裝不少APP的用戶,找個某一個APP,都特別困難。用Spotlight輸入APP的名字,即可找到。用戶在Spotlight也可以方便查找大衆點評中的某一個餐廳。服務器
Spotlight給咱們提供了這樣好的功能,應用開發者怎樣使用呢?微信
**app
iOS 9 Search API概述dom
**ide
•A private on-device index(私有設備索引)。保存在用戶設備上,不會同步到服務器與其它設備上。網站
•Apple’s server-side index (Apple server索引)。pubulic index,內容保存在應用服務器。spa
**
Search API的三種用法
**
NSUserActivity
這個類咱們很熟悉在iOS 8的時候,咱們就拿它來作Handoff,在iOS 9中咱們能拿它來作更多的事兒了~在這裏咱們先說它的搜索功能,當內容被記NSUserActivity,就能夠在 Spotlight 和 Safari 中同時被搜索到,如今這裏咱們只介紹建立用戶索引。
Core Spotlight
iOS 9中全新提出的Api,容許App在本地存一個相似索引的文件,能夠曾刪改查,用來搜索本地內容(on-device index)。適合持續的用戶數據。
Web markup。
網站上的內容如何在App中存在能夠在搜索顯示App相關信息,pubulic index.內容必須在應用服務器,蘋果經過applebot獲取相關數據,iOS全部用戶都可以利用Spotligight和Safari搜索功能獲取到相關內容。(國內不支持)
**
爲App添加Spotlight支持
**
新建了一個Demo工程作例子演示,最後會提供Demo下載地址
-(IBAction)creatSearchableItem{
CSSearchableItemAttributeSet注:Spotlight只支持iOS 9+若是你的項目支持iOS 9如下版本須要添加以下方法判斷
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000 //code... #endif
第一步:導入Framework
MobileCoreServices.framework
CoreSpotlight.framework
第二步:導入頭文件
第三步:建立Spotlight索引
*attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeImage]; // 標題 attributeSet.title = @"標題"; // 關鍵字,NSArray可設置多個 attributeSet.keywords = @[@"demo",@"sp"]; // 描述 attributeSet.contentDescription = @"description"; // 圖標, NSData格式 attributeSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"icon"]); // Searchable item CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"1" domainIdentifier:@"linkedme.cc" attributeSet:attributeSet]; NSMutableArray *searchItems = [NSMutableArray arrayWithObjects:item, nil]; //indexSearchableItems 接收參數NSMutableArray [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchItems completionHandler:^(NSError * error) { if (error) { NSLog(@"索引建立失敗:%@",error.localizedDescription); }else{ [self performSelectorOnMainThread:@selector(showAlert:) withObject:@"索引建立成功" waitUntilDone:NO]; } }]; }
CSSearchableItemAttributeSet設置Spotlight搜索內容的類,咱們能夠設置各類屬性以下圖
方法聲明
- (instancetype)initWithUniqueIdentifier:(NSString *)uniqueIdentifier domainIdentifier:(NSString *)domainIdentifier attributeSet:(CSSearchableItemAttributeSet *)attributeSet;
參數詳解
查看官方文檔
經過上面的操做咱們已經能夠在Spotlight中搜索到咱們建立的索引內容了,能夠搜索到了下一步就是怎麼經過搜索內容打開相應的頁面.
經過搜索結果跳轉到相應頁面
在Appdelegate中添加下面方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{ NSString* idetifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"]; //獲取傳入的索引數據的惟一標識 if ([idetifier isEqualToString:@"1"]) { DemoOneViewController * ovc = [[DemoOneViewController alloc]init]; UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; [navigationController pushViewController: ovc animated:true]; } NSLog(@"%@",idetifier); return YES; }
同時Spotlight還提供刪除索引方法,過時的索引須要手動刪除,系統提供了三個刪除索引方法
經過identifier刪除索引
- (IBAction)deleteSearchableItemFormIdentifier{ [[CSSearchableIndex defaultSearchableIndex] deleteSearchableItemsWithIdentifiers:@[@"1"] completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"%@", error.localizedDescription); }else{ [self performSelectorOnMainThread:@selector(showAlert:) withObject:@"經過identifier刪除索引成功" waitUntilDone:NO]; } }]; }
經過DomainIdentifiers刪除索引
- (IBAction)deleteSearchableItemFormDomain{ [[CSSearchableIndex defaultSearchableIndex] deleteSearchableItemsWithDomainIdentifiers:@[@"linkedme.cc"] completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"%@", error.localizedDescription); }else{ [self performSelectorOnMainThread:@selector(showAlert:) withObject:@"經過DomainIdentifiers刪除索引成功" waitUntilDone:NO]; } }]; }
刪除全部索引
- (IBAction)deleteAllSearchableItem{ [[CSSearchableIndex defaultSearchableIndex] deleteAllSearchableItemsWithCompletionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"%@",error.localizedDescription); }else{ [self performSelectorOnMainThread:@selector(showAlert:) withObject:@"刪除全部索引成功" waitUntilDone:NO]; } }];
由以上步驟,移動開發者在開發APP時,能夠集成Spotlight功能,可是在編程時,會遇到各類各樣的坑。集成Spotlight功能能夠和深度連接結合,將大大下降開發成本,加強的深度連接也引導從渠道(微信、微博、短信、郵件等)上一鍵喚醒APP。Spotlight和深度連接將怎樣更好的融合呢。請見《Core Spotlight和深度連接結合使用(下)》