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

相关文章
相关标签/搜索