2010-10-24 9 views
2

Dans une application Cocoa, nous pouvons généralement installer un bundle de plug-ins dans l'un des nombreux endroits. Si, par exemple l'application est appelée "MyApp" vous seriez en mesure d'installer le plug-in à:Cocoa: Moyen correct d'obtenir la liste des répertoires PlugIns possibles pour une application?

  • /Applications/MyApp.app/Contents/PlugIns
  • ~/Bibliothèque/Application Support/MyApp/PLUGINS
  • /Bibliothèque/application support/MyApp/Plug-ins
  • /Réseau/Bibliothèque/application support/MyApp/Plug-ins

Je construis un NSArray de chemins pour rechercher dans l'ordre correct, mais je suis à peu près sûr que je fais cela mal sinc Il me semble que je fais trop de travail pour quelque chose qu'Apple semble fournir beaucoup de fonctions.

NSArray *systemSearchPaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSAllDomainsMask, YES); 
NSMutableArray *searchPaths = [NSMutableArray array]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 

for (NSString *systemPath in systemSearchPaths) { 
    NSString *systemPluginsPath = [systemPath stringByAppendingPathComponent:@"PlugIns"]; 
    // FIXME: Remove debug code 
    NSLog(@"Considering plugin path %@", systemPluginsPath); 
    if ([fileManager fileExistsAtPath:systemPluginsPath]) { 
     [searchPaths addObject:systemPluginsPath]; 
    } 
} 

[searchPaths addObject:[[NSBundle mainBundle] builtInPlugInsPath]]; 

Il en résulte le tableau renvoyé par NSSearchPathForDirectoriesInDomains, avec la valeur builtInPlugInsPath ajoutée à la fin. Cependant, il recherche en fait des répertoires comme "~/Library/Application Support/PlugIns" (il manque le dossier "MyApp"). Avant de commencer à pirater le code pour injecter le nom de mon application (qui est susceptible de changer à tout moment), est-ce que je me trompe?

Est-il possible de simplement dire Cocoa « me donner tous les chemins de recherche pour « Plug-ins » » Vous le faites à droite.

répertoires pour cette application "?

Répondre

2

Non. Vous pouvez obtenir le nom de votre application au moment de l'exécution en demandant le paquet principal de son dictionnaire d'information et recherche kCFBundleNameKey y. Lorsque vous renommez votre application, modifiez le nom de paquet dans votre Info.plist.

(Certainement ne pas utiliser de votre application , car c'est beaucoup plus fragile.)Sachez que les utilisateurs risquent de ne pas aimer que les plug-ins qu'ils installent cessent de fonctionner parce que vous avez renommé votre application. Notez que votre code ci-dessus n'attrapera pas le dossier PlugIns à l'intérieur de l'ensemble d'applications. Pour cela, demandez à votre bundle principal le chemin ou l'URL de son plug-in intégré.

+0

Merci. Je l'ai bien fonctionné, en vérifiant d'abord tous les chemins du système comme indiqué ci-dessus, puis en vérifiant le buildInPlugInsPath comme retourné par le paquet principal. Merci pour les conseils sur la dénomination. Je vais changer mon code, car actuellement il utilise la valeur CFBundleExecutable, pas le nom du bundle lui-même. – d11wtq