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