2010-10-24 41 views
2

在Cocoa應用程序中,我們通常可以在多個位置之一安裝插件包。例如,如果應用程序被稱爲 「MyApp的」 你能夠在安裝插件:可可:正確的方式來獲取應用程序可能的插件目錄列表?

  • /Applications/MyApp.app/Contents/PlugIns
  • 〜/庫/ Application Support/MyApp的/插件
  • /庫/ Application Support/MyApp的/插件
  • /網絡/庫/ Application Support/MyApp的/插件

我建立的路徑的NSArray以正確的順序進行搜索,但我很確定我正在做這個錯誤的辛克e感覺就像我爲蘋果似乎提供了許多功能做了太多的工作。

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

這導致由NSSearchPathForDirectoriesInDomains返回的數組,追加到末尾的builtInPlugInsPath值。

但是,它實際上搜索「〜/ Library/Application Support/PlugIns」(缺少「MyApp」)文件夾。在我開始竊取代碼以注入我的應用程序的名稱(可隨時更改)之前,我做錯了什麼?

有沒有辦法直接告訴可可「給我一個‘插件’的所有搜索路徑」目錄此應用程序「?

回答

2

不。你這樣做是正確的。

你可以得到通過詢問主束其信息字典,並尋找其中kCFBundleNameKey命名您在運行時應用的。當你重命名你的應用程序,在你的Info.plist改變包名稱。

(絕對不使用應用程序的文件名爲,因爲這更脆弱。)

請注意,如果因爲您重命名應用程序而導致安裝的插件停止工作,用戶可能不會喜歡它。

請注意,上面的代碼不會捕獲應用程序包內的PlugIns文件夾。爲此,請向您的主包提供其內置插件路徑或URL。

+0

謝謝。我很好地工作,首先檢查所有系統路徑,如上所述,然後檢查主包所返回的buildInPlugInsPath。感謝關於命名的建議。我將更改我的代碼,因爲當前使用的是CFBundleExecutable值,而不是包名本身。 – d11wtq 2010-10-26 04:29:16

相關問題