[iOS 9] Search

IOS/공통 2015. 11. 5. 12:15
 (1)NSUserActivity, (2)Core Spotlight Framework를 통해 Searchable Data를 구성하는 방법을 자세히 알아보겠습니다.


1.NSUserActivity
- 정의
NSUserActivity는 Hand-Off 기능을 지원하는 클래스로서, iOS 8에서 release 되었습니다.(Hand-Off 기능관련 해서는 다음에 자세히 알아보겠습니다.)
iOS 9에서는 기존 Hand-Off 기능이외에 Search 기능을 가능하게 하기 위해 몇가지 property들을 추가했습니다. 이로써 개발자들은 원하는 데이터를 NSUserActivity를 통해 Searchable하게 만들 수 있고, 유저들은 Spotlight(검색창)을 통해 해당 데이터를 검색할 수 있습니다.

- Detail


- NSUserActivity 객체를 만들때 activityType으로 unique identifier를 지정하고, 해당 unique identifier를 info.plist파일에 지정해야 합니다.

static NSString *const kActivityType   = @"com.nhnent.HSG2510.IOSNinePrj.employee";
static NSString *const kSearchTitleKey = @"searchTitleKey";
static NSString *const kDescriptionkey = @"descriptionKey";

- (void)setupUserActivity
{
   
 NSUserActivity *sActivity = [[NSUserActivity alloc]initWithActivityType:kActivityType];
   
    [sActivity setTitle:mSearchTitle]; 
    [sActivity setUserInfo: @{ kSearchTitleKey : @“홍성곤",
                               kDescriptionkey : @“앱기술 개발팀, IOS 개발자"}];
   
   
 NSArray *sSearchKeywords = [[sActivity userInfo] allValues];
   
    [sActivity setKeywords:[NSSet setWithArray:sSearchKeywords]];
    [sActivity setEligibleForSearch:YES];
   
    [self setUserActivity:sActivity];
}

- (
void)updateUserActivityState:(NSUserActivity *)activity
{
    [activity
 addUserInfoEntriesFromDictionary:@{ kSearchTitleKey : mSearchTitle,
                                                 
 kDescriptionkey : mDescription}];
}
* activityType: activity를 unique하게 식별해 줄 수 있는 indentifier라고 보시면 되겠습니다. 애플에서는 reverse DNS formatted string을 쓰도록 강요하고 있습니다.
* title: activity 이름이라고 보시면 됩니다. 이것은 사용자가 검색창에서 검색할때 Primary Name란에 나타납니다.
* userInfo: NSUserActivity는 IOS 8에 소개된 feature로써 Hand-Off 기능을 가능하게 만드는 객체입니다. 유저가 지금까지 행한 동작들에 대한 정보를 부가적으로 설명하기 위한 Dictionary입니다. 다른 APP에서 해당 NSUserActivity객체를 받으면 이 객체 안에 들어있는 정보만을 가지고 유저가 어떤 행동을 했는지( 어떤 인터넷 뉴스를 읽었는지, 어떤 화면을 보고 있었는지) 인지하여 해당 화면 및 상태로 유도할 수 있도록 돕는 Dictionary입니다.
* keywords: 유저가 검색할 때 사용하는 keywords 입니다. 유저는 해당 UserActivity에 저장되어 있는 contents를 title, keywords로 검색할 수 있습니다.
* setEligibleForSearch값을 YES로 설정해서 해당 contents가 검색이 가능하도록 합니다.

기본적으로 NSUserActivity 저장 및 사용은 UIResponder의 하위 클래스에서만 동작이 되도록 구현되어 있습니다. updateUserActivityState: 함수는 UIResponder의 lifeCycle동안(사용자의 event를 감지) 여러번 불려집니다. 즉, 이 함수 안에서 UserActivity의 상태를 최신으로 update해야 합니다.


- (BOOL)application:(UIApplication *)aApplication continueUserActivity:(nonnullNSUserActivity *)aUserActivity restorationHandler:(nonnull void (^)(NSArray *_Nullable))aRestorationHandler
{
    //해당 화면 이동작업
   
   
 return YES;
}
사용자가 검색창에서 검색된 contents를 tap하면 해당하는 앱내에서 검색된 contents를 포함하고 있는 UserActivity가 전달 됩니다. 전달된 시점에 UserActivity정보를 이용해서 해당 contents가 있는 화면(일반적으로 viewController)으로 이동시켜 줘야 합니다. UserActivity가 전달되는 메시지는  AppDelegate의 "application:continueUserActivity:restorationHandler:" 입니다.


2.CoreSpotlight
- 정의
CoreSpotlight는 iOS9에서 Search 기능을 위해 release된 프레임워크 입니다.
Searcable Data에 좀더 많은 정보를 제공하거나, 한번에 많은 데이터를 searchable하게 만들때 주로 사용합니다.

- Detail
위에서 소개한 NSUserActivity만으로 search 화면에서 해당 contents가 검색되게 만들 수 있습니다. 하지만 좀 더 많은 정보를 제공해 주기 위해서는 coreSpotlight 프레임워크의 CSSearchableItemAttributeSet을 NSUserActivity에 지정해줘야 합니다.

- (CSSearchableItemAttributeSet *)attributeSet
{
   
 CSSearchableItemAttributeSet *sAttributeSet = [[CSSearchableItemAttributeSetalloc] initWithItemContentType:(__bridge NSString *)kUTTypeContact];
   
    [sAttributeSet
 setTitle:@"홍성곤"];
    [sAttributeSet
 setContentDescription:@"앱기술 개발팀, IOS 개발"];
    [sAttributeSet setThumbnailData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"bla~ bla~"]]];
    [sAttributeSet setSupportsPhoneCall:YES];
    [sAttributeSet setPhoneNumbers:@[ @"010xxxxxxx" ]];
    [sAttributeSet setKeywords:@[ @"앱기술 개발팀", @"IOS 개발" ]];
    [sAttributeSet setRelatedUniqueIdentifier:unique ID”];
   
   
 return sAttributeSet;
}

NSUserActivity *sActivity = [[NSUserActivity alloc]initWithActivityType:kActivityType];
[sActivity setContentAttributeSet:[self attributeSet]];
*CSSearchableItemAttributeSet은 CoreSpotlight framework에서 제공하는 객체 입니다. 이 객체에 좀더 자세하고 많은 정보를 넣을 수 있습니다.
*contentDescripton을 지정할 수 있습니다. 검색할때 Primary Name밑에 표시 됩니다. 
*ThumbnailImage 세팅이 가능하고, 전화번호가 지정 되어있다면 통화 기능까지 제공합니다.
 

CoreSpotlight는 이외에도 한꺼번에 많은 데이터를 Searchable하게 만들 수 있습니다.
예를 들어 json 파일이나 서버에서 넘어온 데이터들을 위에서 소개한 CSSearchbleItemAttributeSet객체를 생성하고 해당 AttributeSet을 CSSearchableItem에 지정합니다.

- (CSSearchableItem *)searchableItem
{
    CSSearchableItem *sSearchableItem = [[CSSearchableItem alloc]
                                         initWithUniqueIdentifier:”unique ID”
                                         domainIdentifier:kActivityType
                                         attributeSet:[self attributeSet]];
   
   
 return sSearchableItem;
}
* UniqueIdentifier : CSSearchbleItemAttributeSet 객체에서 지정한 unique ID와 같은 값을 지정합니다. 이는 NSUserActivity의 searchable Data와의 중복을 방지해 줍니다.
    예를 들어 NSUserActivity에 CSSearchbleItemAttributeSet를 지정해서 만든 searchable data와 CSSearchableItem으로 만든 data가 같을경우 
  유저가 검색창에 검색을 햇을때 중복 결과가 나타나지 않게 해줍니다.
* domainIdentifier : NSUserActivity를 생성할때 지정해줬던 kActivityType값과 같이 reverse DNS formatted string을 사용하여 지정합니다.


- (void)indexAllEmployees
{
   
 NSArray *sSearchableItems = [self searchableItemsFromEmployees];
   
    [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:sSearchableItems completionHandler:^(NSError * aError) {
       
 if (aError)
        {
            NSLog(
@"index searchableItem error");
        }
       
 else
        {
            NSLog(
@"employees is indexed");
        }
    }];
}
* json파일, 서버 등등에서 생성한 CSSearchableItem을 array로 생성하여 searchable하게 만드는 코드 입니다.


- (void)destroyEmployeesIndexing
{
    [[CSSearchableIndex defaultSearchableIndex] deleteAllSearchableItemsWithCompletionHandler:^(NSError * aError) {
       
 if (aError)
        {
            NSLog(
@"error deleting index");
        }
       
 else
        {
            NSLog(
@"employees indexing deleted");
        }
    }];
}
* 반대로 searchable데이터를 제거하는 코드 입니다.


지금까지 NSUserActivity와 CoreSpotlight 프레임워크를 이용해 searchableData를 만들어 봤습니다. 위에서 소개한 내용은 해당 객체와 프레임워크를 사용하는 가장 기본적인 튜토리얼 입니다. 좀더 많은 기능을 사용하기 위해서는 iOS 레퍼런스 사이트를 참고해 주세요.


출처 : NHN Ent 기술공유 게시판

'IOS > 공통' 카테고리의 다른 글

About Bundle  (0) 2017.02.14
iOS Architecture  (0) 2016.12.18
UIApplicationMain?  (0) 2016.02.18
디버깅 (Crash 핸들링)  (1) 2015.11.05
[IOS 9] 개요  (0) 2015.11.05
Posted by 홍성곤
,