2012-01-12 14 views
6

Qualcuno sa di un buon modo per trovare (nel filesystem) ogni app con un determinato identificatore di bundle? NSWorkspace e Servizi di avvio consentono di cercare un'app per identificatore di gruppo, ma restituiscono solo un singolo risultato. Sospetto che Spotlight (NSMetadataQuery) possa essere d'aiuto, ma sono un po 'poco chiaro sulla sua API, quindi non sono sicuro che ci sia una chiave appropriata.Come trovare più app con lo stesso identificatore di bundle?

C'è lo strumento da riga di comando lsregister (all'interno di LaunchServices.framework), che può essere detto di (ri) registrare tutto sul sistema e quindi scaricare un report su tutto ciò che sa. Affidarsi a ciò sembra non essere l'ideale, dal momento che non è documentato e l'analisi della sua produzione potrebbe essere un problema.

(Sfondo: sto creando un'applicazione per il modding del gioco e voglio fornire un'interfaccia utente per scegliere rapidamente da un breve elenco di giochi supportati piuttosto che richiedere all'utente di scavare attraverso l'intero filesystem in un pannello aperto. Mi aspetto che sia molto probabile che un utente abbia più copie di un gioco installato: versione beta e, copie extra per modding, ecc.)

+0

Un po 'più efficientemente, 'lsregister' può essere detto di (re) registrare solo * una * cosa, e quindi scaricare un report su tutto ciò che sa. – JWWalker

+0

Hai citato i servizi di lancio, ma devi aver perso la vista di LSCopyApplicationURLsForBundleIdentifier() in . "I servizi di lancio ti consentono di cercare un'app per identificatore di gruppo, ma restituiscono solo un singolo risultato", a quale funzione ti riferivi? Vedere la mia risposta: http://stackoverflow.com/a/37153167/754997 –

+0

@ChrisPage: in effetti, tornando nel tempo di 10.7, mi sono perso vedendo che Apple introdurrebbe solo la funzione che ho bisogno di tre versioni OS X successive. – rickster

risposta

4

Questa domanda è stata posta nel 2012 su OS X Lion 10.7. Come di OS X Yosemite 10.10 la risposta è:

LSCopyApplicationURLsForBundleIdentifier

Sommario:

Dato un identificatore di fascio (come com.apple.finder), trovare tutti gli URL per l'applicazione corrispondente.

Discussione:

Restituisce zero o più URL da applicazioni che hanno l'identificatore pacchetto specificato.

7

Si desidera la chiave kMDItemCFBundleIdentifier Spotlight/metadati.

pierre$39> mdfind "kMDItemCFBundleIdentifier == 'org.videolan.vlc'" 
/Applications/VLC.app 
/Applications/vlc-0.8.6c/VLC.app 

Da lì si dovrebbe essere solo una questione di fare le chiamate giuste per la file metadata APIs (scegli il tuo veleno, Carbonio o cacao). È interessante notare che questa chiave non è molto ben documentata: non è in File Metadata Attributes Reference, anche se è in MDItem Reference.

Ancora una volta, sta a dimostrare che gli strumenti di gioco di modding sollevano casi d'uso alcuni altri tipi di applicazioni sollevano, e that sometimes aren't very well served by Apple ... </soapbox >

Addendum: una volta che avete la vostra lista, a mio parere il modo migliore per presentarlo all'utente sarebbe da elencare la versione (kMDItemVersion) di ogni elemento trovato; potresti anche mostrare il percorso, ma probabilmente la versione sarà la cosa più utile per l'utente (dopotutto, probabilmente mantiene diverse istanze per avere versioni specifiche).

+0

Funziona molto bene, grazie! Sto vedendo un problema strano, però: quando cerco "com.blizzard.WarcraftIII" usando 'mdfind', funziona bene, ma quando uso' NSMetadataQuery', i risultati hanno un valore per 'kMDItemDisplayName' ma no' kMDItemPath '(o' kMDItemVersion' per quella materia). Altri ID bundle funzionano bene (almeno quelli che ho provato, la mia app funziona con i giochi Blizzard e WoW e SC2 sono gli altri che ho a disposizione per i test). Sospetto che sia un bug ... – rickster

+0

@rickster Sei sicuro di non avere almeno il percorso? (Ho War3 ma non ho Xcode su questa macchina, quindi non posso controllare.) In effetti War3 non sembra avere una versione utilizzabile, e anche se è un bug devi fare qualcosa, quindi se riesci a ottenere il percorso o l'URL (questo oggetto deve essere da qualche parte!), puoi applicare l'elaborazione specifica di War3 per ottenere informazioni interessanti, ad es. ottenendo quella chiave BlizzardFileVersion non standard da Info.plist. A proposito, sei un professionista per avere il riflesso per ottenere il nome visualizzato. –

+0

Sì, nessun percorso. Chiaramente 'NSMetadataQuery' ha trovato l'app e ha il percorso; altrimenti non sarebbe stato in grado di dirmi il nome ... ma il risultato è privo della chiave 'kMDItemPath' (e anche di alcuni altri). Cosa c'è di più questo sembra essere il caso per qualsiasi query che trova tale app (cioè cercando per nome non otterrà un percorso). Molto strano. Farò qualche ricerca per vedere se ci sono altri pacchetti di app che presentano questo problema e probabilmente faranno un'altra domanda qui e/o presentare un bug. – rickster

1

Un'altra alternativa è utilizzare LSCopyApplicationURLsForURL per trovare tutte le copie di tutte le applicazioni che gestiscono uno schema URL specifico. Ciò richiede tuttavia che l'applicazione definisca uno schema URL.

Ad esempio, è possibile trovare tutte le applicazioni di posta elettronica che gestiscono lo schema 'mailto', anche se sul sistema sono presenti più versioni della stessa app.

Questo è l'unico modo che conosco per ottenere tutte le applicazioni, invece di ciò che il sistema considera l'applicazione 'predefinita' o 'preferita' restituita con altre chiamate.

+0

Vero: questo funziona piuttosto bene per i casi in cui le app che si desidera trovare dichiarano schemi URL univoci. Non è sicuro che sia il caso delle app che stavo cercando quando ho chiesto questo un paio di anni fa, però. (E benvenuti a SO!) – rickster

+0

Vero, e ho aggiornato la mia risposta per specificare tale requisito. – coderSeb

+0

Vedere la mia risposta: LSCopyApplicationURLsForBundleIdentifier http://stackoverflow.com/a/37153167/754997 –

Problemi correlati