IOS9新特性 – Search APIs

在IOS9之前,你只能用spotlight通过app的名字找到对应的app。但随着iOS9  Search APIs 的发布,开发者可以通过在app内部的内容中建立索引,通过搜索关键字来进入到app指定的内容区域。

The 3 APIs

NSUserActivity

The NSUserActivity 在iOS8的 Handoff 使用中有介绍到。到了iOS9中,你可以利用NSUserActivity搜索相关的“活跃信息”。你可以提供一些关键词给这些“活跃信息”, 意味着spotlight可以检索它们。这个操作相当于你在浏览网页的时候,有历史记录的作用一样。用户可以通过spotlight快速的打开最近的“活跃信息”。

Web Markup

Web Markup 允许 apps 映射它们的内容到网页上面,然后方便spotlight在网页中快速检索内容。Apple的索引器将会扮演爬虫的角色,在网页上面检索那些被Markup的内容。这些信息在Safari和Spotlight都可以检索。

Core Spotlight

Core Spotlight是iOS9中的一个新框架,它允许检索在app中的内容。NSUserActivity在保存用户的历史记录是很有用的;而Core Spotlight可以检索任何你想要的数据。

使用Core Spotlight APIs

NSUserActivity 和 Web Markup APIs 相对而言是很容易使用的,而 Core Spotlight 是有一点复杂的。为了演示Core Spotlight是怎样工作的,我们创建一个比较简单的Demo用来展示朋友列表。然后你点击任意一个朋友的名字,你可以看到朋友的头像的具体信息。在演示具体的流程之前,我们先看看最终效果图。

在演示效果中可以看到,我在spotlight中检索相关朋友信息,可以看到他们的大致信息,然后点击一条信息,便可以跳转到自己app中的具体的朋友详情。

 

   
   
  1. 代码分析:
  2.  
  3. 1. Demo的结构很简单,就是一个导航控制器,根控制器是一个UITableViewController,用来展示朋友名称列表。我们定义为FriendTableViewController
  4.  
  5. 2. 当点击列表中的一个朋友名称后,就会跳转到详情页面,我们定义为FriendViewController
  6.  
  7. 3. 所有的朋友数据信息,我们用一个管理类来管理。我们定义为DataSource。这个管理类的职责:
  8.  
  9. 1)存储所有的朋友数据信息。
  10.  
  11. 2)保存用户信息到Core Spotlight的索引器中。
  12.  
  13. 当然,每一条用户信息对应一个模型,定义如下:
  14.  
  15. Person.h
  16.  
  17.  
  18. @interface Person : NSObject
  19. @property (nonatomic, copy) NSString *name;
  20. @property (nonatomic, copy) NSString *identifer;
  21. @property (nonatomic, copy) NSString *icon;
  22. - (instancetype)initWithName:(NSString *)name identifer:(NSString *)identifer icon:(NSString *)icon;
  23. @end
  24. Person.m
  25.  
  26.  
  27. @implementation Person
  28. - (instancetype)initWithName:(NSString *)name identifer:(NSString *)identifer icon:(NSString *)icon {
  29.     if (self = [super init]) {
  30.         self.name = name;
  31.         self.identifer = identifer;
  32.         self.icon = icon;
  33.     }
  34.     return self;
  35. }
  36. @end
  37. DataSource.h的方法列表如下:
  38.  
  39.  
  40. @interface Datasource : NSObject
  41. - (NSArray *)dataList;
  42. - (Person *)findFriendWithId:(NSString *)identifer;
  43. - (void)savePeopleToIndex;
  44. @end
  45. 1dataList方法就是获取所有的用户列表数据信息。
  46.  
  47. 2findFriendWithId: 方法就是根据用户Id获取模型数据。
  48.  
  49. 3savePeopleToIndex就是保存所有用户数据信息到Core Spotlight的索引器中。
  50.  
  51. DataSource.文件中的代码
  52.  
  53.  
  54. @implementation Datasource
  55. - (NSArray *)dataList {
  56.     Person *becky = [[Person alloc] initWithName:@"Becky" identifer:@"1" icon:@"becky"];
  57.     Person *ben = [[Person alloc] initWithName:@"Ben" identifer:@"2" icon:@"ben"];
  58.     Person *jane = [[Person alloc] initWithName:@"Jane" identifer:@"3" icon:@"jane"];
  59.     Person *pete = [[Person alloc] initWithName:@"Pete" identifer:@"4" icon:@"pete"];
  60.     Person *ray = [[Person alloc] initWithName:@"Ray" identifer:@"5" icon:@"ray"];
  61.     Person *tom = [[Person alloc] initWithName:@"Tom" identifer:@"6" icon:@"tom"];
  62.     return @[becky, ben, jane, pete, ray, tom];
  63. }
  64. - (Person *)findFriendWithId:(NSString *)identifer {
  65.     for (Person *in self.dataList) {
  66.         if ([p.identifer isEqualToString:identifer]) {
  67.             return p;
  68.         }
  69.     }
  70.     return nil;
  71. }
  72. - (void)savePeopleToIndex {
  73.     // prepare
  74.     NSMutableArray *searchableItems = [NSMutableArray array];
  75.     for (Person *in self.dataList) {
  76.         // Create an attribute set for an item that represents an image.
  77.         CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"image"];
  78.         attributeSet.title = p.name;
  79.         attributeSet.contentDescription = [NSString stringWithFormat:@"This is an entry all about the interesting person called %@", p.name];
  80.         attributeSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:p.icon]);
  81.         CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:p.identifer domainIdentifier:@"com.ios9daybyday.SearchAPIs.people" attributeSet:attributeSet];
  82.         [searchableItems addObject:item];
  83.     }
  84.     // save
  85.     [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchableItems completionHandler:^(NSError * _Nullable error) {
  86.         if (error) {
  87.             NSLog(@"error message:%@", error.localizedDescription);
  88.         }
  89.     }];
  90. }
  91. @end
  92. 代码的关键部分就是savePeopleToIndex方法,定义的searchableItems就是用来存储相关的可检索的信息;而代码中的CSSearchableIndex的单例方法indexSearchableItems是真正的将searchableItems中的内容存储到Core Spotlight中的操作。
  93.  
  94. 然后我们看看FriendTableViewController的列表展示页面的主要代码
  95.  
  96.  
  97. - (void)viewDidLoad {
  98.     [super viewDidLoad];
  99.     Datasource *dataSource = [Datasource alloc];
  100.     self.dataList = [dataSource dataList];
  101.     [dataSource savePeopleToIndex];
  102. }
  103. 这里的savePeopleIndex就将内容存储到Core Spotlight中了。
  104.  
  105.  

现在你运行程序,这些数据将会被存储起来了。当你在spotlight中搜索你的朋友,他们将会出现,效果图如下:

此时尝试点击一项,但是它不会跳转到app的指定区域,只会跳转到对应的app,因为我们还没有指定要跳转的指定区域。

 

 

 

   
   
  1. 我们可以在调用continueUserActivity代理方法的时候指定app的行为。代码如下:
  2.  
  3.  
  4. - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler NS_AVAILABLE_IOS(8_0) {
  5.     NSString *friendID = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];
  6.     UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
  7.     [navigationController popToRootViewControllerAnimated:NO];
  8.     FriendTableViewController *friendVC = (FriendTableViewController *)navigationController.viewControllers.firstObject;
  9.     [friendVC showFriendWithId:friendID];
  10.     return YES;
  11. }
  12. 1句代码:       获取你在spotlight中点击的朋友的id
  13.  
  14. 23句代码:    获取到根的导航控制,并且pop掉栈中所有的控制器。
  15.  
  16. 4句代码:          跳转到app的指定位置。
  17.  
  18. 这里的代码可以可以发现,之前我们保存到Core SpotLight索引器中的内容现在可以使用userActivity.userInfo字典进行获取了。我们所关心的就是friend Id,它是被保存到索引器中作为Person这个对象的kCSSearchableItemActivityIdentifier.
  19.  
  20. 正如你所见的,左上角有一个 "Back to search"选项,用户可以点击这里返回用户列表。
  21.  
  22. 这篇文章中,并没有涉及到索引器的删除操作,想要了解删除的具体操作,可以参照以下的几个方法:
  23.  
  24.  
  25. deleteSearchableItemsWithIdentifiers
  26. deleteSearchableItemsWithDomainIdentifiers
  27. deleteAllSearchableItemsWithCompletionHandler
  28.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值