iOS 애플리케이션을 개발하다보면 애플리케이션의 컨텐츠를 iOS의 내장 검색 기능으로 제공하고자 할 때가 있습니다. CoreSpotlight 프레임워크를 통해 애플리케이션의 컨텐츠를 인덱싱하고, CoreSpotlight의 검색 기능을 통해 해당 컨텐츠를 검색할 수 있습니다. 이번 글에서는 CoreSpotlight 프레임워크를 사용하여 사용자가 애플리케이션의 데이터를 검색할 수 있도록 하는 방법을 살펴보겠습니다.
CoreSpotlight이란?
CoreSpotlight는 iOS 9에서 소개된 프레임워크로, 사용자가 iOS 기기에서 시스템 검색을 통해 애플리케이션의 컨텐츠를 찾을 수 있도록 도와줍니다. 이를 통해 사용자는 애플리케이션 내의 중요한 데이터나 문서, 미디어 등을 빠르게 검색할 수 있습니다.
CoreSpotlight를 사용하면 애플리케이션 데이터를 시스템 인덱스에 추가할 수 있으며, 사용자가 iOS의 내장 검색 기능을 통해 해당 데이터를 검색하면 애플리케이션으로 연결되는 검색 결과가 표시됩니다.
CoreSpotlight를 사용한 데이터 인덱싱
CoreSpotlight를 사용하여 데이터를 인덱싱하기 위해서는 CSSearchableItem
과 CSSearchableItemAttributeSet
을 사용해야 합니다.
먼저 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의 내장 검색 기능을 사용하여 애플리케이션의 데이터를 빠르게 검색하고 이동할 수 있게 됩니다.