アプリサンドボックスを使用するようにLionアプリを変換しています。10.7.3で導入されたセキュリティスコープのブックマーク機能を利用して、フォルダへの永続的なアクセスを許可しようとしています。以下のコードはnilブックマークを返し、次のログメッセージを生成します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);
}
アップデート(x3)
これで動作するようになったので、ユーザーがでリソースを選択した後にPowerboxがリソースへのアクセスを許可するため、上記のコードでの呼び出しが不要である-startAccessingSecurityScopedResource
ことを確認できます。-stopAccessingSecurityScopedResource
NSOpenPanel
別のアプリセッションで作成されたアプリスコープのブックマークからドキュメントスコープのブックマークを作成するなど、別のセキュリティスコープのURLからブックマークを作成する場合は、最初にファイルにアクセスする必要があります。