SpotLight和NSUserActivity的使用

来源:互联网 发布:mac etc目录 编辑:程序博客网 时间:2024/05/01 10:11

 

1.1 NSUserActivity的基本使用

 

NSUserActivity一开始是专门用于IOS8的handoff功能

NSUserActivity *activity2 = [[NSUserActivity alloc]initWithActivityType:domainIdentifier];

 

Handoff是iOS8新出的一个功能,它可以在你的iPhone、iPad和Mac上自由切换未完成的邮件,未制作完的文档,在有人拨打你的 iPhone,你正在使用iPad,这时候就不需要放下iPad区接听电话,而可以直接在iPad上接听。这些功能可能在不经意间就方便了我们的生活。

 

现在也可以通过这个类来使用到我们的App搜索上

用到SpotLight的相关API首先需要我们添加两个FrameWork

#picture1


同时需要我们导入头文件

#picture1


当需要有存一些参数如进房信息等方便接下来的操作,我们可以通过

设置NSUserActivity 里面的 userInfo属性,userInfo是一个字典,方便存入我们的需要的参数信息。

 

NSUserActivity使用的时候需要 self.activity= activity 强引用,然后再执行[activitybecomeCurrent];添加到索引库里面去。

 

NSUserActivityDelegate会在activity存进去前会回调下面的方法

-(void)userActivityWillSave:(NSUserActivity*)userActivity

{

 

}

 

为了提高我们的索引的易搜索性,我们可以通过设置keywords。

并通过设置eligibleForPublicIndexingeligibleForSearch来动态显示或者隐藏该索引。

 

[[CSSearchableIndexdefaultSearchableIndex] deleteAllSearchableItemsWithCompletionHandler:^(NSError){

}

 

NSUserActivity 删除需要把指针置为nil 而且执行上面的方法

 


当搜索出来的结果并且点击进去的时候,会回调AppDelegate的这个方法,同时我们可以获得userActivity中的所有参数信息,并可以通过该参数信息来进行一系列的操作。

 

-(BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity *)userActivityrestorationHandler:(void (^)(NSArray * _Nullable))restorationHandler

 

 

1.2显示更多信息

CSSearchableItemAttributeSet

为了显示更多的信息,我们用到了CssearchableItemAttributeSet这个类

通过以下语句来使得userActivity显示更多的信息

userActivity.contentAttributeSet= attributeSet

 

显示的图片

attributeSet.thumbnailData= UIImageJPEGRepresentation([UIImage imageNamed:@"123"], 0.9);

 

显示的内容摘要

attributeSet.contentDescription= @"sssssdd"

 

显示标题(上下同时设置的时候会以上面为标准)

attributeSet.title= @"wo ai wzy123"

 

是否支持打电话

attributeSet.supportsPhoneCall = @1;          

attributeSet.phoneNumbers = @[@"13189254221"];

#picture1

 

 

是否支持导航(同时这个需要设置经度和纬度)打开后会直接进入到地图搜索

attributeSet.supportsNavigation= @1;

attributeSet.latitude= @1;

attributeSet.longitude= @2;


#picture1

 

 

 

2.1 CSSearchableItem 的基本使用

 

这是IOS9以上才能用的一个类,CoreSpotlight框架上的

 

苹果Spotlight处于全局搜索的位置,在其下方将会有一个全新的界面,在顶端搜索栏这里你可以通过键盘输入文字或者用Siri语音下达命令。整个界面显示了最近通话过的联系人、使用过的应用程序,以及你可能感兴趣的去处

 

使用CSSearchableItem的时候同样也需要我们先定义一个

CSSearchableItemAttribute

CSSearchableItemAttributeSet*attributeSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:(NSString *) kUTTypeContact];

    attributeSet.title = @"timefwj";

    attributeSet.contentDescription =@"helllocococcocococ";

    attributeSet.supportsPhoneCall = @1;

    attributeSet.phoneNumbers =@[@"13380886920"];

    attributeSet.emailAddresses =@[@"306788159@qq.com"];

    attributeSet.keywords =@[@"hellod"];

 

 

然后通过上面的CSSearchableItemAttribut和UniqueIdentifier和一个domainIdentifier来初始化一个CSSearchableItem

 

CSSearchableItem*item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"kg.fwj"domainIdentifier:@"kg.fwj1" attributeSet:attributeSet];

 

与上面的UserActivity不同的是,CSSearchableItem 不能存参数到某一个容器里面去,当点击搜索出来的结果后,同样是回调AppDelegate里面的方法

 通过以下方法添加到容器里面去

   [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler:^(NSError * _Nullable error) {
        
    }];


-(BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity *)userActivityrestorationHandler:(void (^)(NSArray * _Nullable))restorationHandler

 

通过上面的方法我们同样可以获得一个userActivity,这个userActivity 只拥有@"kCSSearchableItemActivityIdentifier"一个键,通过这个值可以获得上面初始化CSSearchableItem中UniqueIdentifier

 

 

混用的时候通过判断activityType来确定是userActivity还是CSSearchableItem

ifuserActivity.activityType == Employee.domainIdentifier,

  let activityObjectId =userActivity.userInfo?["id"]

  as? String {

//1

  objectId = activityObjectId

}else if userActivity.activityType ==

  CSSearchableItemActionType,

  let activityObjectId = userActivity

 .userInfo?[CSSearchableItemActivityIdentifier] as? String {

//2

  objectId = activityObjectId

}

 

2.2 CSSearchableIndex 的基本使用

 

这个类是负责把初始化好的CSSearchableIndex添加到索引库中去,添加进去后就可以通过SpotLight搜索出来

 

[[CSSearchableIndexdefaultSearchableIndex] indexSearchableItems:@[item]completionHandler:^(NSError * _Nullable error) {

    if (error) {

      NSLog(@"%@",error.localizedDescription);

    }

 }];

 

通过UniqueIdentifier或者domainIdentifier 来删除CSSearchableItem 这也是和UserActivity不同的地方,UserActivity删除的时候并没有不可以通过标识来删除

[[CSSearchableIndexdefaultSearchableIndex] deleteSearchableItemsWithDomainIdentifiers:@[@"KG.TestSpotlight"]completionHandler:^(NSError * _Nullable error) {

        if(error)

        {

            NSLog(@"%@",error);

        }

    }];

 

[[CSSearchableIndexdefaultSearchableIndex] deleteSearchableItemsWithIdentifiers:@[@"kg.fwj"]completionHandler:^(NSError * _Nullable error) {

       

}];

 

 

批量导入CSSearchableItem

//批量的时候可能出现问题,然后获取到ClientState来确定从哪里重新开始添加进去

这时需要new一个CSSearchableIndex出来而不是用本来的[[CSSearchableIndex defaultSearchableIndex]

 

    CSSearchableIndex *index = [CSSearchableIndexnew];

    [index fetchLastClientStateWithCompletionHandler:^(NSData *_Nullable clientState, NSError * _Nullable error) {

      

       NSLog(@"%@",clientState);

        [index beginIndexBatch];

       [indexindexSearchableItems:@[item,item2] completionHandler:nil];

        [indexdeleteSearchableItemsWithIdentifiers:@[] completionHandler:nil];

        [indexendIndexBatchWithClientState:clientState completionHandler:^(NSError * _Nullableerror) {

           

        }];

}];

 

3.1 Spotlight Index Extension


#picture1

 

A Core Spotlight app extension provides your app theopportunity to run maintenance operations on its index when the app is notrunning. In the event your app's index is lost or did not properly save thesystem may call your extension to perform its duty.

 

Core Spotlight app的扩展提供了您的应用程序的机会,运行维护操作时,该应用程序的索引是不运行。在事件中,您的应用程序的索引是丢失或未正确保存系统可调用您的扩展来执行它的职责。

 


0 0
原创粉丝点击