Tìm hiểu API Search IOS

1. Giới thiệu

Hôm nay nhân lúc nông nhàn mình có 1 bài viết vớ vẩn về API Search của IOS. Có từ iOS8 nhưng bây giờ mình mới đọc :v. API mới này của iOS rất tiện dụng và nếu bạn tận dụng được nó, nó sẽ là công cụ hỗ trợ đắc lực cho app của bạn. API Search này của iOS cho phép bạn search content app của bạn hoặc Web Content. Ví dụ như app truyện tranh MangaRock, với API Search cho phép search tên truyện trực tiếp qua thanh spotlight của Iphone hoặc Ipad (IfYouKnowWhatIMean).

thumb_IMG_1078_1024.jpg

2. Các tính năng chính của API Search

Nói thật mình dốt tiếng anh nên đếu nói rõ được API Search tính năng như thế nào. Nhưng đại để các cụ bảo thế này: API Search Bao gồm:

  • Class NSUserActivity: cho phép bạn khai báo tên một locaion nào đó trong app để search ví dụ với app báo chí thì có thể set keyword search của activity là sport, health hoặc football. Ngoài ra nó còn có các property để public hoặc private (hình như theo apple là on-device) content hoặc title được search.
  • Core Spotlight framework: cung cấp metadata cho deep search ví dụ như tên truyện tranh, tên ảnh, hoặc description hoặc... bạn tự tìm hiểu nhá. Và nó được private ko publilc.
  • Web Markup: cho phép bạn search nội dung web content tăng trải nghiệm search của user.

Bạn có thể tham khảo tại: https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/Choosing.html#//apple_ref/doc/uid/TP40016308-CH3-SW1

Hình vẽ minh hoạ

movie_2x.png

Class NSUserActivity là class từ đó bạn khởi tạo việc search với search theo location trong app. sau đó nếu bạn muốn add thêm tính năng cho việc search như description thì hãy thêm contentAttributeSet cho NSUserActivity. Chú ý là bạn chỉ có thể có property đó khi import framework CorespotLight vào project của bạn. Nếu bạn muốn search item riêng trong app ví dụ trên truyện tranh hoặc tên ảnh thì bạn hãy dùng Corespotlight framework.

3. Trải nghiệm API Search với project sample

Có một cái là Xcode dạo này hay lỗi. Nếu bạn code cái API Search từ đầu nhiều lúc nó ko chạy như mong muốn, khi đó hãy reset lại simulator và chạy lại từ đầu nhá. Ở project này mình muốn trải nghiêm 2 thứ:

  • Khai báo và khởi tạo title và keyword search như nào
  • Khi user chọn app của mình sau khi search được thì sẽ hứng sự kiện đó như thế nào

Bạn khởi tạo project default của xcode.

import <CoreSpotlight/CoreSpotlight.h>

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self activitySearch];
    }

    - (void)activitySearch {
        self.userActivity = [[NSUserActivity alloc]initWithActivityType:@"com.search"];
        //self.userActivity.title = @"God";
        // Nếu set title cho userAcitivity sẽ hiển thị title của acitivity thay vì của attribute set
        self.userActivity.keywords = [NSSet setWithArray:@[@"Angel"]];
        self.userActivity.userInfo = @{@"id":@"Powerful"};
        self.userActivity.eligibleForSearch = YES;
        self.userActivity.eligibleForPublicIndexing = YES;
        CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:(NSString *)kUTTypeImage];
        attributeSet.keywords = @[@"Angel"];
        attributeSet.title = @"God";
        attributeSet.contentDescription = @"Metqua";
        attributeSet.thumbnailURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"search" ofType:@"png"]];
        self.userActivity.contentAttributeSet = attributeSet;
        [self.userActivity becomeCurrent];
    }
  • Các bạn khởi tạo NSUserActivity với unique identifier để sau này khi hứng event có thể phân biệt được các user activity. Add attributeSet khi bạn muốn search cụ thể một item nào đó như description hoặc thumbanil image hoặc vv. Apple cung cấp một thư viện CSSearchableItemAttributeSet extension khá phong phú cho từng loại content search vd media, image, document.

Simulator Screen Shot Apr 23, 2016, 9.38.37 PM.png

  • Search riêng item không qua activity:

      CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:(NSString *)kUTTypeImage];
      attributeSet.keywords = @[@"Angel"];
      attributeSet.title = @"God3";
      attributeSet.contentDescription = @"Metqua";
      attributeSet.thumbnailURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"search" ofType:@"png"]];
      CSSearchableItem *item = [[CSSearchableItem alloc]initWithUniqueIdentifier:@"com.god" domainIdentifier:@"god" attributeSet:attributeSet];
      [[CSSearchableIndex defaultSearchableIndex]indexSearchableItems:@[item] completionHandler:^(NSError * _Nullable error) {
    
      }];
    

    Simulator Screen Shot Apr 23, 2016, 10.44.00 PM.png

  • Hứng sự kiện tap vào search

      - (BOOL)application:(UIApplication *)application willContinueUserActivityWithType:(NSString *)userActivityType{
          UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"OK" message:userActivityType preferredStyle:UIAlertControllerStyleAlert];
          [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
          [alert dismissViewControllerAnimated:YES completion:^{
    
      }];
      }]];
          [self.window.rootViewController presentViewController:alert animated:YES completion:^{
    
      }];
          return YES;
      }
    

Simulator Screen Shot Apr 23, 2016, 9.41.09 PM.png

4. Kết luận