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 "?
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