2

私の OS X アプリ (現在はサンドボックス化されていません) は、ユーザーが設定したディレクトリ内に含まれるファイルにアクセスします (1 つは a でパスを選択し、NSOpenPanelこのパスへの参照は実行中保持されます)。ファイルのリストは and を介して生成され、次に(C++ ではブリッジ ヘッダーを使用して)および(ブリッジ ヘッダーNSDirectoryEnumeratorを使用) をそれぞれ使用して、これらのファイルの読み取りと書き込みを行います。AVAssettaglib

予想どおり、Xcode でサンドボックスを有効にするとアプリが役に立たなくなり、指定されたファイルのリストNSDirectoryEnumeratorが空になり、そうでない場合でもファイルの読み取りと書き込みができなくなります。アプリをサンドボックスに準拠させるために必要な手順は何ですか?

アプリはドキュメント ベースである必要がありますか? 適切なドキュメントを実際に持っていないので、私のアプリは本当に「ドキュメントベース」になることができますか? 私のアプリは基本的に、ファイル参照を行として持つ単なるテーブル ビューです。もう 1 つの重要な点: アプリがドキュメントベースの場合でも、taglib を使用してファイルに書き込むことはできますか? 機能させるには、ファイルへのパスを文字列ポインターとして taglib に渡す必要があります。

どうもありがとう、このトピックは現時点では非常に混乱しています。

4

2 に答える 2

3

ユーザーが選択したファイルやセキュリティ スコープのブックマークにアクセスするために、アプリをドキュメント ベースに変換する必要はありません。

現在のコードがサンドボックス環境で機能しない理由として、次の 2 つが考えられます。

  • 「ユーザーが選択したファイル アクセス」機能セットを持っていない (Xcode > ターゲット > 機能 > アプリ サンドボックス > ファイル アクセス)
  • URL NSURL ベースの代わりに、ディレクトリ列挙子のパス/NSString ベースの API を使用しています。

サンドボックスが有効で、ユーザーが選択したファイル機能が設定されたバニラ Xcode プロジェクトは、次の方法で取得したパスを列挙する必要がありますNSOpenPanel

NSOpenPanel* panel =[NSOpenPanel openPanel];
panel.canChooseDirectories = YES;
[panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) {
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    NSURL *directoryURL = panel.URL;
    NSDirectoryEnumerator *enumerator = [fileManager
                                         enumeratorAtURL:directoryURL
                                         includingPropertiesForKeys:nil
                                         options:0
                                         errorHandler:nil];
    for (NSURL *url in enumerator) { 
        NSLog(@"url:%@", url);
    }
}];

アプリの起動/終了サイクル全体でサンドボックスから特定のフォルダーにアクセスする機能を保存する場合は、セキュリティ スコープのブックマークを保存する必要があります。この投稿には、アプリ スコープのブックマークを介してユーザーが選択したファイル/ディレクトリ アクセスを保持する情報が含まれています: セキュリティ スコープのブックマークの作成に関する問題

于 2015-11-03T09:28:04.470 に答える