iOS9系列专题二——全新的搜索功能api

简介:

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

一、引言

        iOS9中为我们提供了许多新的api,搜索功能的加强无疑是其中比较显眼的一个。首先,我们先设想一下:如果在你的app中定义一种标识符,在siri和搜索中,可以用过这个标识符搜索到你的app,是不是很棒?不,这还差得远,你可以定义任意的数据,使其在搜索和siri中可以快速检索到,这样的搜索功能是不是非常酷?不,还有更cool的,你甚至可以在你的网站中添加一些标志,使apple的爬虫可以检索到,那样,即使用户没有安装你的app,也可以在搜索中获取到相应的信息,这太强大了,对吧。

二、3种全新的搜索模式

1、NSUserActivity

        我们可以在项目中使用相应的函数来添加一些用户的活跃元素,使我们可以在搜索中通过搜索这样的活跃元素展现我们的app。例如:

?
1
2
3
4
5
6
7
8
9
10
     //创建一个对象,这里的type用于区分搜索的类型
     NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType: @ "myapp" ];
     //显示的标题
     userActivity.title = @ "我的app" ;
     // 搜索的关键字
     userActivity.keywords = [NSSet setWithArray: @[@ "sea" ,@ "rch" ]];
     // 支持Search
     userActivity.eligibleForSearch = YES;
     //提交设置
     [userActivity becomeCurrent];

在下面的函数中,我们可以处理用户点击搜索后的回调:

?
1
2
3
4
5
6
7
8
9
10
11
12
- ( 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:这种方式添加的关键字搜索,必须创建全局变量,否则无法进行搜索:

191703_JDYc_2340880.png

2、CoreSpotlight

        CoreSpotlight是一种更加自由的搜索方式,可以通过添加类似item的模型,将app中的数据展示在搜索栏中,CoreSpotlight框架类似提供了一些增、删、改、查的操作,可是使我们自由的进行搜索属性的设置。

(1)认识3个类

在iOS9中,新增加了3个类,通过对这三个类的操作与配合,我们可以轻易的在app中添加CoreSpotlight搜索的功能。

 CSSearchableItemAttributeSet:设置类,这个类用于设置搜索标签里的icon,内容,图片等。主要用法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//这个类的核心方法只有一个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:搜索标签类,通过这个类,来创建响应的搜索标签。主要内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//这个类主要用于创建搜索的标签
@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的作用,通过它对标签进行增、删、改、查等操作:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@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的搜索功能。

首先,需要在项目中导入如下库:

190756_ZO8R_2340880.png

实现如下代码:

?
1
2
3
4
5
6
7
8
9
10
  //进行标签设置
  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效果如下:

191240_R2bZ_2340880.png

CoreSpotlight的搜索回调和NSUserActivaty一样,只是区分id的方式有所不同:

?
1
2
3
4
5
6
7
8
9
10
11
- ( 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;
}

3、Web Markup

        这个功能与我们app开发关系不大,但是对我app的推广却至关重要,这项技术可以让我们的app关联一个网站,apple通过爬虫来获取我们规定的一些标签值,无论用户是否安装了app,在搜索时,都可以展示出相关信息,因为这项功能主要关联前端技术,需要了解的可以参看:App Search Programming Guide

三、结语

        在我参考的许多相关文章中,都一致建议,iOS9的搜索功能固然强大,然而滥用会造成垃圾信息的泛滥,这样的结果一定会适得其反,作为开发者,我们需要将最合适,最简洁的信息推送到用户的面前。另外,文章有疏漏和错误之处,欢迎指正。


目录
相关文章
|
3月前
|
机器学习/深度学习 API iOS开发
探索iOS开发中的SwiftUI框架深入理解RESTful API设计原则与最佳实践
【7月更文挑战第30天】本文深入探讨了SwiftUI框架在iOS开发中的应用,分析了其对用户界面构建的简化方法及性能优化。通过比较传统UI构建方式与SwiftUI的差异,揭示了SwiftUI如何提高开发效率和用户体验。文章还讨论了SwiftUI在实际项目中的集成策略,并展望了其未来的发展方向。 【7月更文挑战第30天】在数字时代的浪潮中,RESTful API如同一座桥梁,连接着不同的软件系统。本文将探讨RESTful API的核心设计原则,揭示其背后的哲学思想,并通过实例分析展示如何将这些原则应用于实际开发中。我们将从资源定位、接口一致性到HTTP方法的恰当使用,逐一剖析,旨在为开发者提供
52 1
|
4月前
|
Java API
深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能
深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能
70 2
|
1月前
|
API
|
9天前
|
JSON 搜索推荐 API
深入了解亚马逊商品详情API:功能、作用与实例
亚马逊商品详情API接口由官方提供,允许开发者通过程序调用获取商品详细信息,如标题、价格等,适用于电商数据分析、搜索及个性化推荐等场景。接口名称包括ItemLookup、GetMatchingProductForId等,支持HTTP POST/GET请求,需提供商品ID、API密钥及其他可选参数。返回数据格式通常为JSON或XML,涵盖商品详情、分类、品牌、价格、图片URL及用户评价等。该接口对数据收集、实时推荐、营销活动及数据分析至关重要,有助于提升电商平台的数据处理能力、用户体验及商家运营效率。使用时需注册亚马逊开发者账号并申请API访问权限,获取API密钥后按文档构建请求并处理响应数据。
|
2月前
|
JavaScript 网络协议 API
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
|
2月前
|
监控 Cloud Native 容灾
核心系统转型问题之API网关在云原生分布式核心系统中的功能如何解决
核心系统转型问题之API网关在云原生分布式核心系统中的功能如何解决
|
2月前
|
Web App开发 缓存 小程序
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
|
5月前
|
存储 缓存 安全
API在Visual Basic中的应用:连接外部服务与扩展功能
【4月更文挑战第27天】本文探讨了在Visual Basic中使用API连接外部服务和扩展功能的方法,涵盖了API的基本概念、种类及如何使用本地和Web API。通过DllImport调用本地API,利用HttpClient和WebClient与Web API交互,同时强调了第三方API的使用和SOA架构中的API角色。安全性、性能优化和错误处理是实践中的关键点。案例研究和最佳实践有助于开发者更有效地利用API,提升Visual Basic应用程序的功能和灵活性。随着API技术的发展,Visual Basic将持续支持开发者创造更强大的应用。
48 0
|
2月前
|
JSON 算法 API
京东以图搜图功能API接口调用算法源码python
京东图搜接口是一款强大工具,通过上传图片即可搜索京东平台上的商品。适合电商平台、比价应用及需商品识别服务的场景。使用前需了解接口功能并注册开发者账号获取Key和Secret;准备好图片的Base64编码和AppKey;生成安全签名后,利用HTTP客户端发送POST请求至接口URL;最后解析JSON响应数据以获取商品信息。
|
2月前
|
存储 JavaScript 前端开发
探索React状态管理:Redux的严格与功能、MobX的简洁与直观、Context API的原生与易用——详细对比及应用案例分析
【8月更文挑战第31天】在React开发中,状态管理对于构建大型应用至关重要。本文将探讨三种主流状态管理方案:Redux、MobX和Context API。Redux采用单一存储模型,提供预测性状态更新;MobX利用装饰器语法,使状态修改更直观;Context API则允许跨组件状态共享,无需第三方库。每种方案各具特色,适用于不同场景,选择合适的工具能让React应用更加高效有序。
43 0