2011-03-01 18 views
9

Recuerdo que existe una estructura Cocoa o un diccionario AppleScript para verificar si un paquete de Aplicación con un nombre específico está instalado en absoluto, en cualquier lugar de la computadora.Comprueba si hay una aplicación Mac OS X

¿Cómo puedo hacer esto? O bien Cocoa, AppleScript o la línea de comandos me son útiles.

Respuesta

21

Debe utilizar Launch Services hacer esto, específicamente la función LSFindApplicationForInfo().

que lo utilice de esta manera:

#import <ApplicationServices/ApplicationServices.h> 

CFURLRef appURL = NULL; 
OSStatus result = LSFindApplicationForInfo (
            kLSUnknownCreator,   //creator codes are dead, so we don't care about it 
            CFSTR("com.apple.Safari"), //you can use the bundle ID here 
            NULL,      //or the name of the app here (CFSTR("Safari.app")) 
            NULL,      //this is used if you want an FSRef rather than a CFURLRef 
            &appURL 
            ); 
switch(result) 
{ 
    case noErr: 
     NSLog(@"the app's URL is: %@",appURL); 
     break; 
    case kLSApplicationNotFoundErr: 
     NSLog(@"app not found"); 
     break; 
    default: 
     NSLog(@"an error occurred: %d",result); 
     break;   
} 

//the CFURLRef returned from the function is retained as per the docs so we must release it 
if(appURL) 
    CFRelease(appURL); 
+1

no olvide si (appURL) antes del lanzamiento, en caso de que no se encuentre, intentará liberar un objeto inexistente, generando un bloqueo – Daniel

+0

Buen punto, reparado. –

+0

Nota: LSFindApplicationForInfo parece obsoleto a partir de 10.12. Alguien sabe una alternativa? – Tony

3

Desde la línea de comandos esto parece hacerlo:

> mdfind 'kMDItemContentType == "com.apple.application-bundle" && kMDItemFSName = "Google Chrome.app"' 
+3

Usar la API de Spotlight para encontrar una aplicación será mucho más lento que utilizar los Servicios de lanzamiento. –

1

También puede utilizar lsregister.

on doesAppExist(appName) 
    if (do shell script "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep com.apple.Safari") ¬ 
    contains "com.apple.Safari" then return true 
end appExists 

Eso es bastante rápido y puedes hacerlo desde otros lenguajes como Python con bastante facilidad. Te gustaría jugar con lo que necesitas para hacerlo más eficiente.

+0

Tiene razón en que es una solución para los idiomas que no pueden usar API nativas. Sin embargo, sería excesivo llamar a una herramienta de línea de comandos desde una aplicación Cocoa, ya que solo consulta la misma API de Servicios de inicio. –

+0

Es cierto, pero el OP no estaba claro cómo lo estaba usando. Además, otros encontrarán esta página por algún otro problema similar. – Clark