ユーザーがファイルのリストを管理できるようにする基本的な Cocoa アプリがあります。ファイルはドラッグ アンド ドロップで追加され、アプリケーションの再起動後も安全なブックマークにアクセス許可が保持されます。
ここまでは順調ですね。アプリはユーザーのファイルの読み取りと書き込みを許可されていますが、名前の変更は、アプリが親フォルダーへのアクセスを許可されていないことを示すアクセス許可エラーで失敗します。
コード:
[[NSFileManager defaultManager] moveItemAtPath:currentPath
toPath:newPath error:&error]
エラー:
Error Domain=NSCocoaErrorDomain Code=513 "“Some image.jpg” couldn’t
be moved because you don’t have permission to access “some folder”
これは昨日だけ機能していたことを誓います。何も変わっていません...(以下の更新を参照)
ともかく。ユーザーが [開く] ダイアログまたはドラッグ アンド ドロップを介してファイルへのアクセスを許可した場合、サンドボックス化されたアプリケーションがファイルの名前を変更できるようにする必要があると思います。
アップデート:
私はついにこれを私のコードの変更まで追跡することができました:
NSFileCoordinator.item(at: newSrcUrl, willMoveTo: newDstUrl)
実際の移動を実行する前に呼び出すと、エラーを再現できます。この手順をスキップすると、コンソールでエラーが発生することなく、すべてが再び機能します。
完全なコード:
let coordinator = NSFileCoordinator()
coordinator.coordinate(writingItemAt: srcURL, options: .forMerging,
writingItemAt: dstURL, options: .forMerging) { newSrcUrl, newDstUrl in
// Calling this first results in "could not get a sandbox extension" error in console:
//coordinator.item(at: newSrcUrl, willMoveTo: newDstUrl)
try moveItem(at: newSrcUrl, to: newDstUrl)
coordinator.item(at: newSrcUrl, didMoveTo: newDstUrl)
}
item(at oldURL: URL, willMoveTo newURL: URL)
ドキュメントのファイル名拡張子 (.rtf から .rtfd など) を変更するときに意図されているようですが、これは私のアプリには当てはまりません。ファイル拡張子ではなく、ファイル名のみが変更されます。メソッドを呼び出すのがベストプラクティスだと思いましたがwill/didMove
、副作用があるようです。
要約すると、私のアプリが行うことは、ユーザーにフォルダーを開くように求めることだけです (NSOpenPanel
そのため、アプリはそのフォルダーへの書き込み許可を取得します)。その後、アプリはそのフォルダーにファイルを作成し、後で名前を変更します。