[ios] CoreSpotlight와 검색 요청 처리 방법

iOS 애플리케이션을 개발하다보면 애플리케이션의 컨텐츠를 iOS의 내장 검색 기능으로 제공하고자 할 때가 있습니다. CoreSpotlight 프레임워크를 통해 애플리케이션의 컨텐츠를 인덱싱하고, CoreSpotlight의 검색 기능을 통해 해당 컨텐츠를 검색할 수 있습니다. 이번 글에서는 CoreSpotlight 프레임워크를 사용하여 사용자가 애플리케이션의 데이터를 검색할 수 있도록 하는 방법을 살펴보겠습니다.

CoreSpotlight이란?

CoreSpotlight는 iOS 9에서 소개된 프레임워크로, 사용자가 iOS 기기에서 시스템 검색을 통해 애플리케이션의 컨텐츠를 찾을 수 있도록 도와줍니다. 이를 통해 사용자는 애플리케이션 내의 중요한 데이터나 문서, 미디어 등을 빠르게 검색할 수 있습니다.

CoreSpotlight를 사용하면 애플리케이션 데이터를 시스템 인덱스에 추가할 수 있으며, 사용자가 iOS의 내장 검색 기능을 통해 해당 데이터를 검색하면 애플리케이션으로 연결되는 검색 결과가 표시됩니다.

CoreSpotlight를 사용한 데이터 인덱싱

CoreSpotlight를 사용하여 데이터를 인덱싱하기 위해서는 CSSearchableItemCSSearchableItemAttributeSet을 사용해야 합니다.

먼저 CSSearchableItemAttributeSet를 사용하여 해당 데이터의 속성(예: 제목, 설명, 이미지, 파일 형식 등)을 설정하고, 이를 CSSearchableItem을 사용하여 iOS의 시스템 검색 인덱스에 추가합니다.

아래는 CoreSpotlight를 사용하여 데이터를 인덱싱하는 예시입니다.

import CoreSpotlight
import MobileCoreServices

func indexItem(title: String, contentDescription: String, uniqueIdentifier: String, thumbnailData: Data?, keywords: [String]) {
    let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
    attributeSet.title = title
    attributeSet.contentDescription = contentDescription
    attributeSet.thumbnailData = thumbnailData
    attributeSet.keywords = keywords

    let item = CSSearchableItem(uniqueIdentifier: uniqueIdentifier, domainIdentifier: "com.example.myapp", attributeSet: attributeSet)

    CSSearchableIndex.default().indexSearchableItems([item]) { error in
        if let error = error {
            print("Error indexing item: \(error.localizedDescription)")
        } else {
            print("Item indexed successfully")
        }
    }
}

위의 코드에서 indexItem 함수는 데이터를 CSSearchableItem으로 만들고, CSSearchableIndex를 사용하여 해당 아이템을 시스템 인덱스에 추가합니다. 이때, uniqueIdentifier는 해당 데이터의 유니크한 식별자여야 합니다.

검색 요청 처리

CoreSpotlight를 사용하여 데이터를 인덱싱한 뒤, 사용자가 iOS의 내장 검색 기능을 통해 해당 데이터를 검색하면 애플리케이션에서 검색 요청을 받아 처리해야 합니다. 검색 요청은 주로 NSUserActivity를 통해 처리됩니다.

아래는 검색 요청을 처리하는 예시입니다.

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == CSSearchableItemActionType {
        if let uniqueIdentifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String {
            // 해당 데이터의 uniqueIdentifier를 사용하여 애플리케이션 내에서 검색 결과를 표시하거나 처리함
            // ...
            return true
        }
    }
    return false
}

위의 continue 메서드를 사용하여 NSUserActivity를 처리하고, 검색 결과로부터 해당 데이터의 uniqueIdentifier를 가져와 적절한 처리를 수행할 수 있습니다.

CoreSpotlight를 사용하여 애플리케이션의 데이터를 인덱싱하고, 검색 요청을 처리하면 사용자는 iOS의 내장 검색 기능을 사용하여 애플리케이션의 데이터를 빠르게 검색하고 이동할 수 있게 됩니다.