iOS9中爲咱們提供了許多新的api,搜索功能的增強無疑是其中比較顯眼的一個。首先,咱們先設想一下:若是在你的app中定義一種標識符,在siri和搜索中,能夠用過這個標識符搜索到你的app,是否是很棒?不,這還差得遠,你能夠定義任意的數據,使其在搜索和siri中能夠快速檢索到,這樣的搜索功能是否是很是酷?不,還有更cool的,你甚至能夠在你的網站中添加一些標誌,使apple的爬蟲能夠檢索到,那樣,即便用戶沒有安裝你的app,也能夠在搜索中獲取到相應的信息,這太強大了,對吧。html
咱們能夠在項目中使用相應的函數來添加一些用戶的活躍元素,使咱們能夠在搜索中經過搜索這樣的活躍元素展示咱們的app。例如:前端
//建立一個對象,這裏的type用於區分搜索的類型 NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType: @"myapp"]; //顯示的標題 userActivity.title = @"個人app"; // 搜索的關鍵字 userActivity.keywords = [NSSet setWithArray: @[@"sea",@"rch"]]; // 支持Search userActivity.eligibleForSearch = YES; //提交設置 [userActivity becomeCurrent];
在下面的函數中,咱們能夠處理用戶點擊搜索後的回調:ios
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler: { NSString *activityType = userActivity.activityType; if ([activityType isEqual: @"myapp"]){ // Handle restoration for values provided in userInfo // do something return YES; } return NO; //處理回調 }
TIP:這種方式添加的關鍵字搜索,必須建立全局變量,不然沒法進行搜索:api
CoreSpotlight是一種更加自由的搜索方式,能夠經過添加相似item的模型,將app中的數據展現在搜索欄中,CoreSpotlight框架相似提供了一些增、刪、改、查的操做,但是使咱們自由的進行搜索屬性的設置。數組
在iOS9中,新增長了3個類,經過對這三個類的操做與配合,咱們能夠輕易的在app中添加CoreSpotlight搜索的功能。app
CSSearchableItemAttributeSet:設置類,這個類用於設置搜索標籤裏的icon,內容,圖片等。主要用法以下:框架
//這個類的核心方法只有一個init方法,經過一個類型字符串進行建立,字符串用於在回調中區分 @interface CSSearchableItemAttributeSet : NSObject <NSCopying,NSSecureCoding> - (instancetype)initWithItemContentType:(nonnull NSString *)itemContentType; @end //更多的屬性設置在其擴展類中,例如: @interface CSSearchableItemAttributeSet (CSGeneral) //展現的名稱 @property(nullable, copy) NSString *displayName; //名稱數組 @property(nullable, copy) NSArray<NSString*> *alternateNames; //完整的路徑 @property(nullable, copy) NSString *path; //連接url @property(nullable, strong) NSURL *contentURL; //圖片連接的url @property(nullable, strong) NSURL *thumbnailURL; //設置圖片數據 @property(nullable, copy) NSData *thumbnailData; //設置一個標識符 @property(nullable, copy) NSString *relatedUniqueIdentifier; @property(nullable, strong) NSDate *metadataModificationDate; //內容類型 @property(nullable, copy) NSString *contentType; @property(nullable, copy) NSArray<NSString*> *contentTypeTree; //搜索的關鍵字數組 @property(nullable, copy) NSArray<NSString*> *keywords; //標題信息 @property(nullable, copy) NSString *title; @end
CSSearchableItem:搜索標籤類,經過這個類,來建立響應的搜索標籤。主要內容以下:dom
//這個類主要用於建立搜索的標籤 @interface CSSearchableItem : NSObject <NSSecureCoding, NSCopying> //init方法 - (instancetype)initWithUniqueIdentifier:(nullable NSString *)uniqueIdentifier //Can be null, one will be generated domainIdentifier:(nullable NSString *)domainIdentifier attributeSet:(CSSearchableItemAttributeSet *)attributeSet; //相應 的屬性 @property (copy) NSString *uniqueIdentifier; @property (copy, nullable) NSString *domainIdentifier; @property (copy, null_resettable) NSDate * expirationDate; @property (strong) CSSearchableItemAttributeSet *attributeSet; @end
CSSearchableIndex:這個類,我我的理解,相似一個manager的做用,經過它對標籤進行增、刪、改、查等操做:ide
@interface CSSearchableIndex : NSObject @property (weak,nullable) id<CSSearchableIndexDelegate> indexDelegate; //判斷設備是否支持 + (BOOL)isIndexingAvailable; //取系統的searchIndex管理者 + (instancetype)defaultSearchableIndex; //通常狀況下,咱們不須要從新建立對象 - (instancetype)initWithName:(NSString *)name; - (instancetype)initWithName:(NSString *)name protectionClass:(nullable NSString *)protectionClass; //設置索引標籤 - (void)indexSearchableItems:(NSArray<CSSearchableItem *> *)items completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler; //刪除指定id索引標籤 - (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; @end
下面,咱們經過一個小例子來應用下CoreSpotlight的搜索功能。函數
首先,須要在項目中導入以下庫:
實現以下代碼:
//進行標籤設置 CSSearchableItemAttributeSet * itemSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"myApp"]; itemSet.title = @"個人APP"; itemSet.keywords = @[@"haha",@"123"]; itemSet.contentDescription = @"這是搜索到得內容"; itemSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"Icon-114.png"]); CSSearchableItem * item = [[CSSearchableItem alloc]initWithUniqueIdentifier:@"1" domainIdentifier:@"1" attributeSet:itemSet]; [[CSSearchableIndex defaultSearchableIndex]indexSearchableItems:@[item] completionHandler:nil];
咱們在搜索中輸入haha或者123效果以下:
CoreSpotlight的搜索回調和NSUserActivaty同樣,只是區分id的方式有所不一樣:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler: { NSString *activityType = userActivity.activityType; //先取CSSearchableItemActionType if ([activityType isEqual: CSSearchableItemActionType]) { NSString *uniqueIdentifier = [userActivity.userInfo objectForKey:CSSearchableItemActivityIdentifier]; // do something return YES; } return NO; }
這個功能與咱們app開發關係不大,可是對我app的推廣卻相當重要,這項技術可讓咱們的app關聯一個網站,apple經過爬蟲來獲取咱們規定的一些標籤值,不管用戶是否安裝了app,在搜索時,均可以展現出相關信息,由於這項功能主要關聯前端技術,須要瞭解的能夠參看:App Search Programming Guide。
在我參考的許多相關文章中,都一致建議,iOS9的搜索功能當然強大,然而濫用會形成垃圾信息的泛濫,這樣的結果必定會拔苗助長,做爲開發者,咱們須要將最合適,最簡潔的信息推送到用戶的面前。另外,文章有疏漏和錯誤之處,歡迎指正。
歡迎轉載 請註明出處
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592