0

アプリケーションにサービスを追加しようとしています。このアプリケーションには、たとえば「MyService」と呼ばれるサービスがあります。Finder にファイルがあり、そのファイルを新しい名前で同じ場所にコピーしたいと考えています。ユーザーはファイルを右クリックし、MyService を選択します。新しいファイルは、元のファイルの隣に新しいファイル名で表示されます。問題は、アプリケーションがサンドボックス化されていることです。で選択したファイルのURLを取得できます:

- (NSPasteboardItem*)merge:(NSPasteboard *)pboard
 userData:(NSString *)userData error:(NSString **)error {
    NSArray* fileArray=[pboard propertyListForType:NSFilenamesPboardType];
}

私のfileArrayにはファイルパスが含まれます。その後、このファイルパスを新しいファイル名に変更できます。を使用して新しいファイルを作成するだけの場合:

NSString *filePath = [filesArray objectAtIndex:0];
PDFDocument *PDF = [[PDFDocument alloc] initWithURL:[NSURL fileURLWithPath:filePath]];
NSURL *newFileUrl =[NSURL fileURLWithPath:newfilepath];
[PDF writeToURL:newFileURL];

エラーが出ます!私がやっていることは間違っていることはわかっていますが、ユーザーがアクションをコミットしたことを Finder に伝える方法があるため、このアクションはある意味で保護されています。この newFileURL が許可されていることを確認するにはどうすればよいですか? ご協力ありがとうございました

4

1 に答える 1

1

申し訳ありませんが、サンドボックスではできません。新しいファイルを作成する許可をユーザーに求める必要があります。関連項目ここで説明されているように、ファイル拡張子を変更するだけの非常に特殊なケースでのみ機能します。

別の方法として、ディレクトリ全体への書き込み許可をユーザーに 1 回要求し、Security Scoped Bookmark (SSB) を保存して、アプリを起動するたびにアクセス権を回復することもできます。

編集: Mac App Store の Unarchiver は実際にまさにこの方法で動作し、テスト済みです。「Unarchive To Current Folder」、「Unarchive To Desktop」、「Unarchive To ...」という 3 つの NSServices を発行します。それらはすべて、少なくとも一度は許可を求めます。

ディレクトリ全体の許可を求めるには、この回答NSOpenPanelのasと適切なプロパティを使用してから、SSB で URL を読み取って保存します。setCanChooseDirectories:YESsetCanChooseFiles:NO

于 2015-04-16T13:10:48.537 に答える