I'm using Core Data to save data. Then I wanna add spotlight support.
self.spotlightDelegate = StorageSpotlightDelegate(forStoreWith: description, coordinator: container.persistentStoreCoordinator)
let isSpotlightDisable = UserDefaults.standard.bool(forKey: "isSpotlightDisable")
if !isSpotlightDisable {
self.toggleSpotlightIndexing(enable: true)
}
public func toggleSpotlightIndexing(enable: Bool) {
guard let spotlightDelegate = spotlightDelegate else { return }
if enable {
spotlightDelegate.startSpotlightIndexing()
} else {
spotlightDelegate.stopSpotlightIndexing()
spotlightDelegate.deleteSpotlightIndex { error in
if let error = error {
print(error)
}
}
}
UserDefaults.standard.set(!enable, forKey: "isSpotlightDisable")
}
It works fine on an iOS15 device, but not work on iOS 17&18.
On iOS 18 devices, I can search the data when the first time to added to Core Data. But if I stop spotlight indexing and restart again, the data is never be searched.
How can I to solve this? And I noticed that the problem is also exists in another dictionary app.
Spotlight
RSS for tagSearch for files and index your app’s content for searching using Spotlight.
Posts under Spotlight tag
32 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
We are planning on renaming our app. The new name is not like the current name. It will be renamed in the App Store as well as the App display name. Yet, we still want new and existing users to be able to find the app by using the old name in search/spotlight under iOS. A great example of this is entering Twitter to find the X app and it shows up in the App section in the Spotlight search.
Are there any guidelines, settings, or tricks for doing this? Some have suggested adding a Spotlight search term but that will not have it show up in the App section I fear.
This bundle is invalid. Unable to load ‘Info.plist’ for bundle at path: ‘My App.app/Contents/Library/Spotlight/MyApp-SpotlightIndex.mdimporter’..
This mdimporter is embedded in my app with a Copy step in Build Phases and when I Archive the compiled app, I get that error when I try to Validate. The app works OK, the mdimporter Spotlight works OK, all runs fine. But the Validate on the Archive does not work, it fails with that error.
I'm following the video tutorial below, using the exact examples, but was not able to semantically match the results:
https://developer.apple.com/videos/play/wwdc2024/10131
https://developer.apple.com/documentation/corespotlight/building-a-search-interface-for-your-app
In iOS 18 and macOS 15 and later, Spotlight also supports semantic searches of your content, in addition to lexical matching of a search term.
I'm on macOS 15.1, so I'd expect it should work now? Or is this depend on Apple Intelligence for some reason?
Specifically I've indexed the following:
Keyword: "windsurfing carmel"
Literal match:
the best windsurfing carmel county
windsurfing lessons
Semantic match:
sailboarding lessons
the best windsurfing carmel county
windsurfing lessons
Expected: find semantic match.
Actual: only literal match were returned.
Because CSUserQuery.prepare is only supported by macOS 15, my switch from CSSearchQuery makes no sense without the semantic search benefits.
Did I miss something? I also added the corespotlight delegate extension as directed but was not able to hit the breakpoint as per the video. I wish there is the sample code for this, but couldn't find it.
How do I search for messages on iPhone by date? Running iOS 18.1. In the Spotlight feature, if I type “messages on 10/14” the top 3 results are messages on that date. But if I tap “search in app” I’m brought to a blank messages screen. This function would help me with work so much, and it’s like we’re almost there- but not.
thanks!
Previous I thought that this is something only Apple apps can do, but I just noticed that Google drive can do that too. But I couldnt find the documentation for that. Does anyone know? thanks!
The code below is a simplified form of part of my code for my Swift Package Manager, Swift 5.6.1, PromiseKit 6.22.1, macOS command-line executable.
It accepts a Mac App Store app ID as the sole argument. If the argument corresponds to an app ID for an app that was installed from the Mac App Store onto your computer, the executable obtains some information from Spotlight via a NSMetadataQuery, then prints it to stdout.
I was only able to get the threading to work by calling RunLoop.main.run(). The only way I was able to allow the executable to return instead of being stuck forever on RunLoop.main.run() was to call exit(0) in the closure passed to Promise.done().
The exit(0) causes problems for testing. How can I allow the executable to exit without explicitly calling exit(0), and how can I improve the threading overall?
I cannot currently use Swift Concurrency (await/async/TaskGroup) because the executable must support macOS versions that don't support Swift Concurrency. A Swift Concurrency solution variant would be useful as additional info, though, because, sometime in the future, I might be able to drop support for macOS versions older than 10.15.
Thanks for any help.
import Foundation
import PromiseKit
guard CommandLine.arguments.count > 1 else {
print("Missing adamID argument")
exit(1)
}
guard let adamID = UInt64(CommandLine.arguments[1]) else {
print("adamID argument must be a UInt64")
exit(2)
}
_ = appInfo(forAdamID: adamID)
.done { appInfo in
if let jsonData = try? JSONSerialization.data(withJSONObject: appInfo),
let jsonString = String(data: jsonData, encoding: .utf8)
{
print(jsonString.replacingOccurrences(of: "\\/", with: "/"))
}
exit(0)
}
RunLoop.main.run()
func appInfo(forAdamID adamID: UInt64) -> Promise<[String: Any]> {
Promise { seal in
let query = NSMetadataQuery()
query.predicate = NSPredicate(format: "kMDItemAppStoreAdamID == %d", adamID)
query.searchScopes = ["/Applications"]
var observer: NSObjectProtocol?
observer = NotificationCenter.default.addObserver(
forName: NSNotification.Name.NSMetadataQueryDidFinishGathering,
object: query,
queue: .main
) { _ in
query.stop()
defer {
if let observer {
NotificationCenter.default.removeObserver(observer)
}
}
var appInfo: [String: Any] = [:]
for result in query.results {
if let result = result as? NSMetadataItem {
var attributes = ["kMDItemPath"]
attributes.append(contentsOf: result.attributes)
for attribute in attributes {
let value = result.value(forAttribute: attribute)
switch value {
case let date as Date:
appInfo[attribute] = ISO8601DateFormatter().string(from: date)
default:
appInfo[attribute] = value
}
}
}
}
seal.fulfill(appInfo)
}
DispatchQueue.main.async {
query.start()
}
}
}
Hello when I type “S” to start a search in spotlight, it does not allow it. No message just undos the action.
I would provide screen recording but I think I’m not allowed to upload video.
I've been trying to access the NSMetaData information for mb4 objects that I legally downloaded from third party websites without DRM protection. I posted a request in the app forum before and didn't receive any responses from anyone, so it occurred to me to use the example apple code provided on NSMetaData Objects.
Steps to reproduce: download the "simpleiclouddocument" example and changed the document extension to Mb4. It seems the query fails because the documents are outside the application directory, so I expanded the search scope to include "NSMetaDataQueryAccessibleExternalDocumentsScope" and the files are still not found.
I have the URL of the file that I want the MetaData for. I understand that NSMetaData has an init object that works with a URL but it only works on MacOS and not iOS. I have alternatively tried using LPLinkPresentation and AVMetdataItem but these two alternatives appear to limit the metadata fields I can access and there is no additional object data on how to expand the links to access the other metadata items associated with the file, specifically the Author field as Mb4 files have authors in addition to other audio metadata settings. If there is additional information somewhere on those two classes that identifies how I can access the rest of the metadata fields that would likewise correct my problem.
We are in the process of updating our legacy Spotlight MDImporter to the new macOS Spotlight App Extension.
The transition works well for standard attributes such as title, textContent, and keywords.
However, we encounter an issue when adding custom attributes to the CSSearchableItemAttributeSet.
These custom attributes are not being persisted, which means they cannot be queried using a Spotlight NSMetadataQuery.
Has anyone an idea on how to append custom attributes so that they are included in the indexed file status, as displayed by the shell command mdimport -t -d3 <path>
A sample project illustrating the problem is available here: https://www.dropbox.com/scl/fi/t8qg51cr1rpwouxdl900b/2024-09-04-Spotlight-extAttr.zip?rlkey=lg6n9060snw7mrz6jsxfdlnfa&dl=1
I am asking here after finding no information on this anywhere. There doesn't appear to be any documentation on this. I am having trouble with an 18TB volume over a simple SMB network. One iMac; one Mac Mini with attached storage, ethernet 10g. I have a 6TB volume that has no issues over the same network. Settings are all the same as far as I know.
Both hard drives have a VolumeConfiguration.plist
/Volumes/Media_1/.Spotlight-V100/VolumeConfiguration.plist
/Volumes/Media_2/.Spotlight-V100/VolumeConfiguration.plist
Media_1 is the 18TB HDD
Media_2 is the 6TB HDD
I ran diff on both volumes' VolumeConfiguration.plist and what jumped out was the different string in "PolicyProcess":
diff /Users/john/Documents/media_2plist.txt /Users/john/Documents/media_1plist.txt |colordiff | $(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlight
3c3
< 16D4F012-5E09-4D3B-ACD4-6768C0DA2048 = Dict {
---
> 502C691E-AEE5-4729-B540-722F1C681B19 = Dict {
5,6c5,6
< PolicyProcess = mdutil
< PolicyDate = Thu Jul 25 10:07:47 CST 2024
---
> PolicyProcess = STORE_ADD
> PolicyDate = Tue Aug 27 19:30:08 CST 2024
Why is Spotlight choosing PolicyProcess = STORE_ADD for the 18TB HDD and PolicyProcess = mdutil for the 6TB HDD ?
What is the difference between them and can I choose which PolicyProcess Spotlight uses?
I can't find much from the network on the 18TB drive even after it has been re-indexed multiple times. Oddly it seems that while it is being indexed I get better results than once it has completed indexing.
Thanks for any insights.
I am seeking advice on improving the visibility of my iOS app, "noon Shopping, Food, Grocery," in Spotlight search results for certain keywords. Despite the app's name containing keywords such as "food" and "grocery," it does not seem to appear as prominently in Spotlight searches for these terms as other apps, like "Careem - rides, food & more" which appears readily when searching for "food."
Hello.
I'm adding my mac app contents to spotlight index. I have created a dedicated exported document type which Finder also recognises and shows documents with my extension "artcl" with correct icon I provide with the app. But it does not happen in Spotlight - it shows my documents with default icon.
I create items for Spotligh index as follows:
let myType = UTType(filenameExtension: "artcl")!
var searchableItems: [CSSearchableItem] = []
for itm in items.reversed() {
let attributeSet = CSSearchableItemAttributeSet(contentType: myType)
attributeSet.title = item.title
attributeSet.contentDescription = item.desc
attributeSet.displayName = item.name
attributeSet.keywords = [ item.title ]
attributeSet.comment = item.title + " " + item.desc
attributeSet.contentType = "com.devaikin.spottest.artcl"
let id = "artcl." + item.title + "." + item.name
let indexItem = CSSearchableItem(uniqueIdentifier: id, domainIdentifier: "artcl", attributeSet: attributeSet)
searchableItems.append(indexItem)
let defaultIndex = CSSearchableIndex(name: "Spottest")
defaultIndex.deleteAllSearchableItems()
defaultIndex.beginBatch()
defaultIndex.indexSearchableItems(searchableItems)
...
Items are added to the spotlight and I can find them, but default icon is displayed while I would expect my exported type icon to be shown like Finder does it.
Am I missing something in attributeSet setup?
I know that I can index a maximum of 32767 CSSearchableItem in my application.
Won't there be performance issues in a scenario where each application has the maximum number of indexes? How does the system deal with this situation?
Also, let's say an application indexes the most used 32767 words, won't it abuse the system in this way and be at the top of the search results? What does Apple do about this?
Is there documentation somewhere that specifically details this questions?
onContinueUserActivity(CSSearchableItemActionType, perform) works as expected on iOS when we search and select an item from Spotlight, but nothing happens when we do the same on a SwiftUI macOS app.
var body: some Scene {
WindowGroup {
MyView()
.onContinueUserActivity(CSSearchableItemActionType, perform: handleSpotlight)
}
}
func handleSpotlight(_ userActivity: NSUserActivity) {
// Is not called...
}
How can we respond to a user clicking a Spotlight result from our apps on macOS?
For the past few days, I've been trying to support semantic search with Core Spotlight, but I haven't found any proper source on the Apple Developer site. In the explanation video, Jennifer mentioned checking the link below, but there was no link provided. If anyone is implementing this feature or has more information, could you please share any insights or resources? TIA
In WWDC24 video https://developer.apple.com/videos/play/wwdc2024/10131/ Jennifer mentioned that the app she's talking about would be available in the link below, but there's no such link provided.
Where the mentioned app code could be found?
hey guyss…. Im currently using ios18 developer beta 2 on my iphoen 12…Idk if u guys noticed it or not.. but when i turn off the toggle for “Help improve apple search” (settings->search->help improve apple search)
it again turns on without my knowledge seconds aftr i close the page. Ive tried restarting my iphone & many more.. nothing seems to work.. im kindoff a more private guy i usually turn off apple analytics.. usage diagnostics and i always make sure data is stored only on my local storage.. and this bug kinda piss me off 😕.
i’ve given u the link below to check it out.
Peace.
https://youtube.com/shorts/YfVDCA-Dfrs?si=qLcl0mWL-Jm9iJFz
Hey everyone!
I'm trying to make an iOS app discoverable (in the App Library) with different keywords than its display name. I've experimented with CFBundleName, but it hasn't worked, and I couldn't find any official documentation on it.
Has anyone successfully done this or have any tips? I'd love to hear your insights!
I'm trying CoreSpotlight on the 18b1 seed on iOS and after submitting my query, I'm getting multiple errors about what looks like missing models:
[Model loading] model loading failed with err -1000 for model path /Users/hunter/Library/Developer/CoreSimulator/Devices/0AF4F46E-5510-4458-B61C-F8A153155809/data/Containers/Data/Application/1D8580C0-AC80-4949-9FDA-31DB463BDA5C/Library/Spotlight/Resources_V3/Default/models/spotlight_l2.mlmodelc and directives path /Users/hunter/Library/Developer/CoreSimulator/Devices/0AF4F46E-5510-4458-B61C-F8A153155809/data/Containers/Data/Application/1D8580C0-AC80-4949-9FDA-31DB463BDA5C/Library/Spotlight/Resources_V3/Default/directives/directives_l2.mdplist
I am calling CSUserQuery.prepare() but that doesn't seem to make a difference.
Is there more to this than what is on this page? https://developer.apple.com/documentation/corespotlight/building-a-search-interface-for-your-app?changes=latest_minor