曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

在iOS9中使用CoreSpotlight

在iOS9之前,用户可以通过Spotlight中输入关键字来查找App。在iOS9中Apple随之发布了一套全新的iOS9 Search APIs之后,开发者不但可以自由的将App的部分内容建立索引,还能对Spotlight上的搜索结果以及点击不同的结果显示的内容进行设置。

apple_search_demo.png

三种搜索的API简介

NSUserActivity

NSUserActivity是iOS8专为Handoff推出的API,在iOS9得到了提升。现在用户只需要提供元数据(metadata)就能搜索到不同的活动(Activity)了。也就是说Spotlight可以将Activity加入到索引,而NSUserActivity就好比网页浏览器的历史堆栈(history stack, 可以理解为最近使用的App,或者是近期常用联系人等),用户可以通过Spotlight搜索到最近的Activity.

Web Markup

Web Markup在网页上显示App的内容并建立Spotlight索引,如此一来即便没有安装某个App,苹果的索引器也能在网页上搜索特别的标记(markup),在Safari或Spotlight上显示搜索结果。

CoreSpotlight

NSUserActivity帮助储存用户历史,而全新的CoreSpotlight则能为App中的任何内容创建索引,实质是在用户设备上提供基础的CoreSpotlight索引渠道,满足用户另外一个需求。最典型的一个例子是印象笔记和iOS自带的Note,用户无需打开对应的App通过Spotlight就能搜索到笔记的内容,然后快速打开。

使用CoreSpotlight APIs

1、引入CoreSpotlight.framework

corespotlight_framework

2、创建索引

(1)创建索引所需的元数据

为了让内容可以被搜索,首先需要创建一个包含元数据的属性

searchable_attributes.png

CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"contact"];
attributeSet.title = @"标题";
attributeSet.contentDescription = @"内容";
attributeSet.keywords = @[@"关键字1", @"关键字2"];
attributeSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"缩略图"]);
(2)创建索引
CSSearchableItem *searchableItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"" domainIdentifier:@"" attributeSet:attributeSet];
searchableItem.expirationDate = [NSDate dateWithTimeIntervalSinceNow:3600];

注意:

1)uniqueIdentifier:在应用程序中这个值是唯一的,由于这个可以用于索引的更新、删除索引是唯一的,推荐使用UUID或者是搜索的条目的主键。

2)domainIdentifier:一个可选的标识符,用来表示item的域(domain)或者所有者,这个可能用一个账户的邮箱作为identifier来索引数据,并且当账户删除的时候可以根据这个来删除数据,一般情况下domainIdentifier应该是这种格式.并且不能包含时间。

3)expirationDate:过期的日期,默认过期的日期是一个月

(3)将索引加入到CoreSpotlight
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[searchableItem] completionHandler:^(NSError * _Nullable error) {
	if(error) {
		NSLog(@"%@", [error localizedDescription]);
	}
}];

3、配置用户点击搜索结果的处理动作

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler {
	if([userActivity.activityType isEqualToString:CSSearchableItemActionType]) {
		NSString *uniqueIdentifier = userActivity.userInfo[CSSearchableItemActivityIdentifier];
        //这里根据这个uniqueIdentifier可以跳转到详细信息页面
        return YES;
    }
    return YES;
}

参考资料

1、《App Search Programming Guide》

2、《iOS9 Day-by-Day :: Day 1 :: Search APIs》

3、《CoreSpotlight.framework注释翻译》

最近的文章

在iOS9中使用3D Touch

在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch技术。3D Touch的触控技术,被苹果称为新一代多点触控技术。其实,就是此前在Apple Watch上采用的Force Touch,屏幕可感应不同的感压力度。iOS9提供了四类API(Home Screen Quick Action、UIKit Peek & Pop 、WebView Peek & Pop 和UITouch Force Properties)用于操作3D Touch(Pre...…

iOS继续阅读
更早的文章

使用SQLCipher加密SQLite数据库

在iOS应用程序开发中经常需要使用SQLite来存储数据,很多时候需要加密保存一部分的数据。常见的做法是将要存储的内容先加密然后存到数据库中,使用的时候将数据进行解密,这样就会有大量的性能消耗在数据的加解密上(性能主要取决于加解密的算法和CPU的能力)。 SQLCipher is an open source extension to SQLite that provides transparent 256-bit AES encryption of database files.SQL...…

iOS继续阅读