iOS 9中的搜索為用戶提供了一種新的方式來(lái)訪問(wèn)應(yīng)用內(nèi)部的信息,即使未安裝。當(dāng)您將內(nèi)容設(shè)為可搜索時(shí),用戶可以通過(guò)Spotlight和Safari搜索結(jié)果,Handoff和Siri建議,訪問(wèn)應(yīng)用內(nèi)深層的活動(dòng)和內(nèi)容。使用與搜索相關(guān)的API,您可以決定將哪些內(nèi)容編入索引,在搜索結(jié)果中顯示哪些信息,以及在點(diǎn)擊應(yīng)用或網(wǎng)站的結(jié)果后重定向用戶的位置。
主要有三種搜索類的API:
1、NSUserActivity,索引用戶活動(dòng)以及App的狀態(tài)。
2、iOS 9新增的CoreSpotlight.framework提供了增、刪、改、查等搜索API,可以索引App的內(nèi)容。
3、Web Markup,Web內(nèi)容可被搜索。
前兩個(gè)屬于 私人設(shè)備上的索引。
最后一個(gè)屬于 蘋(píng)果的服務(wù)器端索引。
NSUserActivity
NSUserActivity是iOS 8專為Handoff推出的API,iOS 9之后得到了提升。Spotlight可以將activity編入索引,而NSUserActivity就好比網(wǎng)頁(yè)瀏覽器的歷史堆棧(history stack),使用戶能在Spotlight上搜到最近的活動(dòng)。
Web Markup
Web Markup在網(wǎng)頁(yè)上顯示App的內(nèi)容并編入Spotlight索引,如此一來(lái)即便沒(méi)有安裝某個(gè)App,蘋(píng)果的索引器也能在網(wǎng)頁(yè)上搜索特別的標(biāo)記(markup),在Safari或Spotlight上顯示搜索結(jié)果。
顯示未安裝App的搜索結(jié)果是一大亮點(diǎn),有望為開(kāi)發(fā)者帶來(lái)更多潛在用戶。公布在搜索API上的App深鏈接則儲(chǔ)存在蘋(píng)果的cloud index中。更多詳情,請(qǐng)參閱蘋(píng)果的“Web Markup使用指南(Use Web Markup to Make App Content Searchable)”。
CoreSpotlight
NSUserActivity幫助儲(chǔ)存用戶歷史,而全新的Core Spotlight則能將App中的任何內(nèi)容編入索引,實(shí)質(zhì)是在用戶設(shè)備上提供基礎(chǔ)的Core Spotlight索引渠道,滿足用戶另外一個(gè)需求。
代碼:
#import <CoreSpotlight/CoreSpotlight.h>
NSMutableArray <CSSearchableItem *> *searchableItems = [NSMutableArray array];
CSSearchableItemAttributeSet *attribute = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"ceshiStyle"];
attribute.title = @"測(cè)試標(biāo)題";
attribute.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"ceshi.png"]);
CSSearchableItem *item = [[CSSearchableItem alloc]initWithUniqueIdentifier:@"001" domainIdentifier:@"ceshiNumber" attributeSet:attribute];
[searchableItems addObject:item];
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchableItems completionHandler:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"%@",error);
}
}];
然后在AppDelegate的代理方法中接收點(diǎn)擊搜索結(jié)果的userInfo
#pragma mark - CoreSpotlight
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
NSString *ceshiNumber = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];
//ceshiNumber = 001
return true;
}
最后需要提到的就是索引的刪除。CoreSpotlight給我們提供了三個(gè)方法來(lái)進(jìn)行刪除分別是:
- (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;
根據(jù)identifier來(lái)刪除,根據(jù)domain來(lái)刪除以及刪除所有的索引。
關(guān)于Web Markup,我們只需要在自己的官網(wǎng)的代碼中的head里面加入代碼:
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
affiliate-data和app-argument參數(shù)都是可選的,
文章借鑒自:http://www.csdn.net/article/2015-07-16/2825222-search-apis