2

在 Cocoa 应用程序中,我们通常可以在多个位置之一安装插件包。例如,如果应用程序名为“MyApp”,您可以在以下位置安装插件:

  • /Applications/MyApp.app/Contents/PlugIns
  • ~/库/应用程序支持/MyApp/PlugIns
  • /图书馆/应用程序支持/MyApp/插件
  • /网络/库/应用程序支持/MyApp/PlugIns

我正在构建一条NSArray以正确顺序进行搜索的路径,但我很确定我做错了,因为感觉我为苹果似乎提供了很多功能的东西做了太多的工作。

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

这将导致 Array 返回NSSearchPathForDirectoriesInDomains,并将builtInPlugInsPath值附加到末尾。

但是,它实际上会搜索像“~/Library/Application Support/PlugIns”这样的目录(缺少“MyApp”)文件夹。在我开始破解代码以注入我的应用程序的名称(随时可能更改)之前,我做错了吗?

有没有办法告诉 Cocoa“给我这个应用程序的 'PlugIns' 目录的所有搜索路径”?

4

1 回答 1

2

没有。你做对了。

您可以在运行时通过向主包询问其信息字典并在kCFBundleNameKey其中查找来获取应用程序的名称。重命名应用程序时,请更改 Info.plist 中的包名称。

(绝对不要使用您的应用程序的文件名,因为它更脆弱。)

请注意,如果他们安装的插件因为您重命名应用程序而停止工作,用户可能会不喜欢它。

请注意,您上面的代码不会捕获应用程序包中的 PlugIns 文件夹。为此,请向您的主包询问其内置插件路径或 URL。

于 2010-10-24T23:26:07.543 回答