2009-05-31 6 views
7

Comment énumérer les navigateurs installés sur un système OS X à partir d'une application locale. Je voudrais construire quelque chose comme choosy, mais différent (longue histoire). Cependant, je voudrais énumérer tous les navigateurs installés sur le système.Énumération des navigateurs installés sur OS X

Sur Windows, je peux plonger les navigateurs installés dans les registres de programmes par défaut, cependant, je ne crois pas qu'il existe un concept similaire sur OS X. Dois-je chercher manuellement dans tous les paquets & leur info.plist des dossiers?

Répondre

9

Utilisez LSCopyAllHandlersForURLScheme(CFSTR("http")) ou LSCopyAllRoleHandlersForContentType(CFSTR("public.html"), kLSRolesViewer), ou setintersection des deux.

Ces deux fonctions renvoient des identifiants de regroupement; vous pouvez utiliser LSFindApplicationForInfo pour rechercher l'instance préférée sur le disque d'une application à l'aide de son identificateur de regroupement.

(Ne pas oublier de suivre the Core Foundation memory-management rules.)

Edit: Dans un commentaire sur cette réponse, smorgan suggère LSCopyAllHandlersForURLScheme(CFSTR("https")) comme une alternative au premier appel (c'est http s). C'est une bonne suggestion.

+0

Je remarqué ce sont les API de carbone. Je pensais que le carbone était déprécié? –

+3

Les services de lancement font partie des services de base, pas de carbone. En tant que tel, il n'est pas obsolète et est disponible sur 64 bits. (Voir la documentation: http://developer.apple.com/documentation/Carbon/Reference/LaunchServicesReference/) –

+2

Vous pouvez utiliser "https" au lieu de "http", car dans mon expérience, ce dernier a plus de faux positifs pour les choses qui sont vraiment des navigateurs. – smorgan

0

Cochez cette case pour la liste

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

Ce défaut pour:

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