7

他の場所からダウンロードしたファイルを保存する場所をユーザーに尋ねる、サンドボックス化された Mac App Store アプリを開発しています。ユーザーからフォルダーを取得するための次のコードがあります(一部のエラーチェックを取り除きます):

NSOpenPanel* openPanel = [NSOpenPanel openPanel];
[openPanel setAllowsMultipleSelection:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setResolvesAliases:YES];
NSInteger result = [openPanel runModal];
NSArray* urls = [openPanel URLs];
NSURL* folderURL = [urls objectAtIndex:0];
NSError* error;
NSData* bookmakeData = [folderURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
                           includingResourceValuesForKeys:nil
                                            relativeToURL:nil
                                                    error:&error];
_saveFolderBookmark = bookmakeData;

ファイルをこのフォルダーに移動するときは、次のコードがあります。

BOOL isStale;
NSError* error;
NSURL* saveFolder = [NSURL URLByResolvingBookmarkData:_saveFolderBookmark
                                              options:NSURLBookmarkCreationWithSecurityScope
                                        relativeToURL:nil
                                  bookmarkDataIsStale:&isStale
                                                error:&error];
BOOL success = [saveFolder startAccessingSecurityScopedResource];

// Move the file somewhere else
NSWorkspace* workspace = [NSWorkspace sharedWorkspace];
NSInteger operationTag;
BOOL copied = [workspace performFileOperation:NSWorkspaceMoveOperation
                                       source:[[self getDocumentsFolder] path]
                                  destination:[saveFolder path]
                                        files:[NSArray arrayWithObject:filename]
                                          tag:&operationTag];
[saveFolder stopAccessingSecurityScopedResource];

startAccessingSecurityScopedResource は、NSOpenPanel から ULR を取得した直後、またはその後の実行で、NSUserDefaults に保存されているブックマーク データを使用して、成功を返さないことを示すコードがたくさんあります。

資格ファイルには、他の項目の中でも特に、次のものがあります。

<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>

このコードに何か問題がありますか?

4

2 に答える 2

9

これはとても簡単です。NSURLBookmarkResolutionWithSecurityScope の代わりに NSURLBookmarkCreationWithSecurityScope で解決しています。その行を変更するだけで機能するはずです。

(ブックマークを作成した同じセッションでは、既に URL にアクセスしている場合は機能しない可能性があります。その場合、それを呼び出すことは想定されていないためです。ただし、後で実行する場合は、もちろん、それが全体のポイント。)

于 2012-06-05T18:37:58.337 に答える
1

startAccessingSecurityScopedResource正しい解決策は上に示されていますが、同じ症状を抱えている人(戻ってこない)のために別の可能性を追加すると思いましたYES。Powerbox から返された実際の URL を使用していることを確認してください。これは、アクセスしようとしている実際のリソースの URL とは異なる可能性があります (おそらくそうなるでしょう)。たとえば、Powerbox はパスへの URL を返します。これを使用しstartAccessingSecurityScopedResourceて、そのディレクトリの下にある特定のファイルにアクセスします。

于 2016-09-08T18:10:28.707 に答える