2009-05-31 8 views
7

¿Cómo se enumerarían los navegadores instalados en un sistema OS X desde una aplicación local? Me gustaría construir algo como quisquilloso, pero diferente (historia larga). Sin embargo, me gustaría enumerar todos los navegadores instalados en el sistema.Enumeración de navegadores instalados en OS X

En Windows, puedo bucear en los navegadores instalados en los registros de Programas predeterminados, sin embargo, no creo que haya un concepto similar en OS X. ¿Tengo que buscar manualmente a través de todos los paquetes & su info.plist archivos?

Respuesta

9

Uso LSCopyAllHandlersForURLScheme(CFSTR("http")) o LSCopyAllRoleHandlersForContentType(CFSTR("public.html"), kLSRolesViewer), o la setintersection de ambos.

Esas dos funciones devuelven identificadores de paquetes; puede usar LSFindApplicationForInfo para encontrar la instancia preferida en el disco de una aplicación por su identificador de paquete.

(no se olvide de seguir the Core Foundation memory-management rules.)

Editar: En un comentario en esta respuesta, smorgan sugiere LSCopyAllHandlersForURLScheme(CFSTR("https")) (que es http s) como una alternativa a la primera llamada. Esta es una buena sugerencia.

+0

me di cuenta de que son las API de carbono. Pensé que Carbon estaba siendo desaprobado. –

+3

Launch Services es parte de Core Services, no de Carbon. Como tal, no está en desuso, y está disponible en 64 bits. (Consulte la documentación: http://developer.apple.com/documentation/Carbon/Reference/LaunchServicesReference/) –

+2

Es posible que desee utilizar "https" en lugar de "http", ya que en mi experiencia este último tiene más falsos positivos. para cosas que son realmente navegadores – smorgan

0

Marque esta a la lista

NSArray* apps = (NSArray*)CFBridgingRelease(LSCopyAllHandlersForURLScheme(CFSTR("https"))) ; 
NSLog(@"%@", apps); 

Esto por defecto:

NSString* defaultBundleId = (__bridge NSString*)LSCopyDefaultHandlerForURLScheme(CFSTR("https")); 
NSLog(@"default is %@", defaultBundleId);