Spotlight Manager
unknown
swift
a year ago
2.9 kB
6
Indexable
import Foundation
import CoreSpotlight
import UIKit
import CoreData
public protocol HasSpotlightManager {
var spotlightManager: SpotlightManagerInterface { get }
}
public protocol SpotlightManagerInterface: AnyObject {
func indexItem(identifier: String, title: String, description: String?, image: UIImage?)
func deIndexItem(with identifier: String)
}
public protocol SpotlightDependency {
associatedtype Dependencies
var dependencies: Dependencies { get }
var spotlightManager: SpotlightManagerInterface { get }
}
public extension SpotlightDependency {
private var _dependencies: HasSpotlightManager {
guard let _dependencies = dependencies as? HasSpotlightManager else {
fatalError("Presenter `Dependencies` do not conform to `HasSpotlightManager`")
}
return _dependencies
}
var spotlightManager: SpotlightManagerInterface {
_dependencies.spotlightManager
}
}
public class SpotlightManager: SpotlightManagerInterface {
public static let shared = SpotlightManager()
public func indexItem(identifier: String, title: String, description: String?, image: UIImage?) {
let attributeSet: CSSearchableItemAttributeSet
if let image { // If we have an image add it to hte attribute set
// We should investigate how to make sure that each data is within the size range
let jpegData = image.jpegData(compressionQuality: 0.8)
attributeSet = CSSearchableItemAttributeSet(contentType: .image)
attributeSet.thumbnailData = jpegData
// We can also add thumbnail URL instead of Data
// attributeSet.thumbnailURL = "url.com"
} else { // If we do not have an image, use only text attributes
attributeSet = CSSearchableItemAttributeSet(contentType: .text)
}
attributeSet.title = title
attributeSet.contentDescription = description
attributeSet.identifier = identifier
// Creating an searchable item that represents e.g. an Article
let item = CSSearchableItem(uniqueIdentifier: identifier, domainIdentifier: nil, attributeSet: attributeSet)
// We can add an expiration date to the searchable Item
item.expirationDate = Date.distantFuture
// Adding the item to the index
let searchableIndex = CSSearchableIndex.default()
searchableIndex.indexSearchableItems([item])
}
public func deIndexItem(with identifier: String) {
let searchableIndex = CSSearchableIndex.default()
searchableIndex.deleteSearchableItems(withIdentifiers: [identifier])
}
}
// MARK: Core Data
class SpotlightManagerCoreData: NSCoreDataCoreSpotlightDelegate {
override func domainIdentifier() -> String {
""
}
override func indexName() -> String? {
""
}
}
Editor is loading...
Leave a Comment