iOS9系列專題二——全新的搜索功能api

更加智能的搜索方案——iOS9搜索功能新api

1、引言

        iOS9中爲咱們提供了許多新的api,搜索功能的增強無疑是其中比較顯眼的一個。首先,咱們先設想一下:若是在你的app中定義一種標識符,在siri和搜索中,能夠用過這個標識符搜索到你的app,是否是很棒?不,這還差得遠,你能夠定義任意的數據,使其在搜索和siri中能夠快速檢索到,這樣的搜索功能是否是很是酷?不,還有更cool的,你甚至能夠在你的網站中添加一些標誌,使apple的爬蟲能夠檢索到,那樣,即便用戶沒有安裝你的app,也能夠在搜索中獲取到相應的信息,這太強大了,對吧。html

2、3種全新的搜索模式

‍一、NSUserActivity‍

        咱們能夠在項目中使用相應的函數來添加一些用戶的活躍元素,使咱們能夠在搜索中經過搜索這樣的活躍元素展示咱們的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

        CoreSpotlight是一種更加自由的搜索方式,能夠經過添加相似item的模型,將app中的數據展現在搜索欄中,CoreSpotlight框架相似提供了一些增、刪、改、查的操做,但是使咱們自由的進行搜索屬性的設置。數組

(1)認識3個類

在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
(2)一個小例子

        下面,咱們經過一個小例子來應用下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;
}

三、Web Markup

        這個功能與咱們app開發關係不大,可是對我app的推廣卻相當重要,這項技術可讓咱們的app關聯一個網站,apple經過爬蟲來獲取咱們規定的一些標籤值,不管用戶是否安裝了app,在搜索時,均可以展現出相關信息,由於這項功能主要關聯前端技術,須要瞭解的能夠參看:App Search Programming Guide

3、結語

        在我參考的許多相關文章中,都一致建議,iOS9的搜索功能當然強大,然而濫用會形成垃圾信息的泛濫,這樣的結果必定會拔苗助長,做爲開發者,咱們須要將最合適,最簡潔的信息推送到用戶的面前。另外,文章有疏漏和錯誤之處,歡迎指正。

 

歡迎轉載 請註明出處

 

 

專一技術,熱愛生活,交流技術,也作朋友。

——琿少 QQ羣:203317592

相關文章
相關標籤/搜索