Cacau: Maneira correta de obter a lista de possíveis diretórios de plugins para um aplicativo?

StackOverflow https://stackoverflow.com/questions/4007341

  •  25-09-2019
  •  | 
  •  

Pergunta

Em um aplicativo de cacau, geralmente podemos instalar um pacote de plug -in em um dos vários lugares. Se, por exemplo, o aplicativo for chamado "MyApp", você poderá instalar o plug -in em:

  • /Applications/myapp.app/contents/plugins
  • ~/Biblioteca/suporte de aplicativo/myApp/plugins
  • /Biblioteca/Suporte ao Aplicativo/MyApp/Plugins
  • /Network/Library/Application Support/MyApp/Plugins

Estou construindo um NSArray de caminhos para pesquisar na ordem correta, mas tenho certeza de que estou fazendo isso errado, pois parece que estou fazendo muito trabalho para algo para a Apple para fornecer muitas funções.

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]];

Isso resulta na matriz retornada por NSSearchPathForDirectoriesInDomains, com o builtInPlugInsPath valor anexado até o fim.

No entanto, na verdade, ele pesquisa diretórios como "~/biblioteca/suporte de aplicativo/plugins" (faltando a pasta "myApp"). Antes de começar a invadir o código para injetar o nome do meu aplicativo (que está sujeito a alteração a qualquer momento), estou fazendo isso errado?

Existe uma maneira de apenas dizer ao cacau "me dê todos os caminhos de pesquisa para os diretórios de" plugins "" para este aplicativo "?

Foi útil?

Solução

Não. Você está fazendo isso certo.

Você pode obter o nome do seu aplicativo no tempo de execução pedindo ao pacote principal seu dicionário de informações e procurando por kCFBundleNameKey lá no. Quando você renomear seu aplicativo, altere o nome do pacote em sua info.plist.

(Definitivamente não use o seu aplicativo nome do arquivo, como isso é muito mais frágil.)

Esteja ciente de que os usuários podem não gostar se os plug-ins que instalaram pararem de funcionar porque você renomeou seu aplicativo.

Observe que seu código acima não pegará a pasta Plugins dentro do pacote de aplicativos. Para isso, peça ao seu pacote principal para o caminho ou URL dos plug-ins incorporados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top