私は、私のLionアプリケーションをApp Sandboxを使用するように変換しています。私は、フォルダに永続的にアクセスできるように10.7.3で導入されたsecurity-scoped bookmarks機能を利用しようとしています。私が下のコードは、無しのブックマークを返し、次のログメッセージを生成します:XPC couldn't look up the Mach service for scoped bookmarks agent
。セキュリティスコープのブックマークを作成する際に問題が発生する
User Selected File Access
の資格をRead/Write Access
に設定し、周囲に電話をかけた場合と電話しなかった場合で試してみました(..AccessingSecurityScopedResource
)。
私はドキュメンテーションに従ってすべてをやっていると思いますので、何か参考にしてください。このコードは、アプリをサンドボックス化する前にプレーンURLを取得するために働いていました。
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setAllowsMultipleSelection:NO];
NSInteger result = [openPanel runModal];
if(result == NSFileHandlingPanelCancelButton) {
return;
}
NSArray *urls = [openPanel URLs];
if(urls != nil && [urls count] == 1) {
NSURL *url = [urls objectAtIndex:0];
NSData *bookmark = nil;
NSError *error = nil;
bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil // Make it app-scoped
error:&error];
if (error) {
NSLog(@"Error creating bookmark for URL (%@): %@", url, error);
[NSApp presentError:error];
}
NSLog(@"bookmark: %@", bookmark);
}
アップデート(×3)
今、私はそれが働いてしまったことを、私はPOWERBOXは、リソースへのアクセスを許可するので-startAccessingSecurityScopedResource
と-stopAccessingSecurityScopedResource
への呼び出しは、上記のコードでは必要でないことを確認することができますユーザがNSOpenPanel
でそれを選択した後。
別のアプリケーションセッションで作成されたアプリスコープのブックマークからドキュメントスコープのブックマークを作成するなど、別のセキュリティスコープのURLからブックマークを作成する場合、最初にファイルにアクセスする必要があります。
ブックマークを作成する際に、スタート/ストップ・コールが必要になることはありません。すでにNSOpenPanelからアクセスしています。ブックマークは将来の実行のためにそのアクセスを保存しています。そして、将来の実行では、startAccessingSecurityScopedResourceを呼び出す必要があります(ブックマークの解決から戻ってくるURLで)。 – abarnert
@abarnert私はあなたが正しいと信じています。なぜなら私はNSOpenPanelを使ってコードを投稿しましたが、NSOpenPanelやNSSavePanel以外のソースからブックマークを作成する必要があります。既存のブックマークから新しいブックマークを作成してスコープを変更するなど)。私は自分の投稿を更新しました。 – Dov
「security-scoped bookmarks」が見つかるまで私の目が疲れました。これは本当に参考になるサンプルコードです。タグを作成する権限がありません。タグ「セキュリティスコープのブックマーク」を追加することをおすすめしますか? – Mark