2

通常、Cocoa アプリでは、いくつかの場所のいずれかにプラグイン バンドルをインストールできます。たとえば、アプリの名前が「MyApp」の場合、次の場所にプラグインをインストールできます。

  • /アプリケーション/MyApp.app/コンテンツ/プラグイン
  • ~/Library/Application Support/MyApp/PlugIns
  • /ライブラリ/Application Support/MyApp/プラグイン
  • /Network/Library/Application Support/MyApp/PlugIns

正しい順序で検索するためのパスを作成してNSArrayいますが、Apple が多くの機能を提供しているように見えるものに対してあまりにも多くの作業を行っているように感じるので、これは間違っていると確信しています。

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末尾に値が追加された Array が返されます。

ただし、実際には「~/Library/Application Support/PlugIns」(「MyApp」がない) フォルダーなどのディレクトリを検索します。コードをハッキングしてアプリケーションの名前を挿入する前に (これはいつでも変更される可能性があります)、これは間違っていますか?

Cocoa に「このアプリケーションの「プラグイン」ディレクトリのすべての検索パスを教えて」と伝える方法はありますか?

4

1 に答える 1

2

いいえ。あなたはそれを正しくやっています。

メイン バンドルに info ディクショナリを要求し、その中で検索することにより、実行時にアプリケーションの名前を取得できますkCFBundleNameKey。アプリケーションの名前を変更する場合は、Info.plist でバンドル名を変更してください。

(アプリケーションのfilenameは絶対に使用しないでください。これははるかに壊れやすいためです。)

アプリケーションの名前を変更したために、インストールしたプラグインが機能しなくなった場合、ユーザーが気に入らない可能性があることに注意してください。

上記のコードは、アプリケーション バンドル内の PlugIns フォルダーをキャッチしないことに注意してください。そのためには、組み込みプラグインのパスまたは URL をメイン バンドルに問い合わせてください。

于 2010-10-24T23:26:07.543 に答える