2

I'm trying to expose my app on Spotlight

Basic Info is now exposed but phone call and navigation are not working

This is my code below

    var searchableItems = [CSSearchableItem]()

    let hospitals = contents.compactMap { $0 as? Hospital }
    for hospital in hospitals {
        let searchItemAttributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)
        searchItemAttributeSet.title = hospital.name
        searchItemAttributeSet.contentDescription = "visited"
        searchItemAttributeSet.phoneNumbers = ["00-0000-0000"]
        searchItemAttributeSet.latitude = NSNumber(value: hospital.coordinate.latitude)
        searchItemAttributeSet.longitude = NSNumber(value: hospital.coordinate.longitude)
        searchItemAttributeSet.supportsPhoneCall = 1
        searchItemAttributeSet.supportsNavigation = 1
        let searchableItem = CSSearchableItem(uniqueIdentifier: "\(hospital.identifier)", domainIdentifier: "hospitals", attributeSet: searchItemAttributeSet)
        searchableItems.append(searchableItem)
    }

    CSSearchableIndex.default().indexSearchableItems(searchableItems) { (error) -> Void in
        if error != nil {
            print(error?.localizedDescription ?? "Error")
        }
    }

While searching on Spotlight there are title and contentDescription but not phoneCall Button and navigation Button

How can I add them to result

PrepareFor
  • 2,448
  • 6
  • 22
  • 36

2 Answers2

2

You need to set the properties to true, not 1

for hospital in hospitals {
    let searchItemAttributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)
    searchItemAttributeSet.title = hospital.name
    searchItemAttributeSet.contentDescription = "visited"
    searchItemAttributeSet.phoneNumbers = ["00-0000-0000"]
    searchItemAttributeSet.latitude = NSNumber(value: hospital.coordinate.latitude)
    searchItemAttributeSet.longitude = NSNumber(value: hospital.coordinate.longitude)
    searchItemAttributeSet.supportsPhoneCall = true
    searchItemAttributeSet.supportsNavigation = true
    let searchableItem = CSSearchableItem(uniqueIdentifier: "\(hospital.identifier)", domainIdentifier: "hospitals", attributeSet: searchItemAttributeSet)
    searchableItems.append(searchableItem)
}
Paulw11
  • 108,386
  • 14
  • 159
  • 186
  • thanks!! it works!! then why apple suggest NSNumber not Bool? – PrepareFor Apr 09 '19 at 04:35
  • It is an NSNumber. An NSNumber can wrap a range of numeric types, including bool. Swift automatically wraps the numeric literal is an NSNumber – Paulw11 Apr 09 '19 at 04:37
  • I have one more question, if I support only navigation, it works, but if I support both phone call and navigation, both icons are not visible what should I do? – PrepareFor Apr 09 '19 at 06:09
  • From my testing it seems you can support one or the other, but not both, on a particular search result. – Paulw11 Apr 09 '19 at 10:56
  • The constructor parameter `itemContentType: kUTTypeData as String` or `contentType: UTType.data` is also very important. For example setting `itemContentType: kUTTypeContact as String` or `contentType: UTType.contact` creates searchable item, only the dialing button is not shown. I wish it was written somewhere - now it is here :) – Štěpán Jun 01 '22 at 10:40
0

You can try to set the keywords you want to search for. for example searchItemAttributeSet.keywords = ["xxx", "xxx"];